Защита буфера памяти без блокировки

Используя реализацию очереди без блокировки для хранения указателей на набор предварительно выделенных буферов, я обнаружил, что некоторые буферы все еще записываются одним потоком, в то время как другой поток начинает его использовать. Я уже защитил буфер записи и чтения с барьерами памяти, но, похоже, не работает.

Нить 1 петля:

auto b=queue.AcquireBuffer();

for (int x=0;x<BUF_SIZE;x++)
{
b->GetData()[x]=-999999999990;          // A
}
atomic_thread_fence(memory_order_seq_cst)   // edit: still does not work
high_resolution_clock::time_point tp=high_resolution_clock::now();
b->GetData()[1]=1+time_diff(tp,tp_normal);  // B

atomic_thread_fence(memory_order_seq_cst);
queue.PushBuffer(b);

Нить 2 петли:

auto bb=queue.Peak();

atomic_thread_fence(memory_order_seq_cst);

if ((bb[0])->GetData()[1] < 0) {
std::cout<<"fail"<<endl;
ready=true;
while (1) {}
}

queue.Pop();

Через некоторое время я получаю «fail» в качестве вывода, что означает, что Thread 2 видит неупорядоченное выполнение блоков A и B. Я хочу, чтобы это происходило по порядку. Как я могу это исправить? (Предположим, что time_diff всегда возвращает положительное число)

Источник очереди: http://pastebin.com/raw.php?i=PFBzMPPF

Весь источник: https://docs.google.com/file/d/0B8gY3VVJJr1IMktobnhYelBva2c/edit?usp=docslist_api

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]