У меня есть следующий код синхронизации, и он, кажется, не ждет переменную условия по желанию. Цель состоит в том, чтобы порождать все потоки, а затем заставить всех начать работать одновременно.Правильное использование переменных условий
Преждевременно, как представляется, называется. Любые идеи почему?
chrono::milliseconds timeNThreadsLockFree(int n, int worksize)
{
boost::lockfree::stack<int> data(totalNumberOfWorkItems);
vector<thread> ts;
atomic<int> count;
condition_variable cv;
mutex mut2;
unique_lock<mutex> ul(mut2,defer_lock);
lock(ul,mut);
auto startSpawn = chrono::high_resolution_clock::now();
for (int i = 0; i < n; i++)
ts.push_back(thread([&](){
cv.wait(ul, [](){return true; });
int q = 5;
for (int j = 0; j < worksize; j++){
data.push(7);
else count++;}
}));
if (count != 0) {
cout << "premature" << endl; }
cv.notify_all();
auto startWait = chrono::high_resolution_clock::now();
for (auto&& t : ts)
t.join();
auto endWait = chrono::high_resolution_clock::now();
if (count != totalNumberOfWorkItems)
cout << "not done" << endl;
return chrono::duration_cast<chrono::milliseconds>(endWait - startWait);
}
Если удалить лямбда я получаю «Блокировка проводится различными контексте» как утверждают неудачу в Visual Studio. То же самое дело, если я сделаю лямбда-ответ ложным. Идеи? – soandos
Другая вещь, которую нужно отметить, это то, что я никогда не хочу, чтобы блокировка была необходима. Это делается в этом случае? – soandos
@soandos Что произойдет, если вы попытаетесь создать отдельный 'std :: unique_lock' для каждого из потоков, с тем же мьютексом, а затем попробуйте дождаться этого? – Xymostech