我使用两种方法实现了并发队列:添加(入队)& 删除(出列)。
为了使用2个线程测试我的实现,我在一个名为getRandom()的方法中生成了介于0和1之间的10个(NUMBER_OF_OPERATIONS)个随机数。这允许我创建添加和删除操作的不同分布。
doWork 方法将按线程数分割工作。
问题:我从main函数传入的threadID与doWork方法接收的threadID不匹配。以下是一些示例运行:
<a>
答案 0 :(得分:3)
在这一行中,您可以通过引用来捕获i
:
myThreads[i] = std::thread ( [&] { bQ.doWork(randomNumbers, i); });
这意味着当另一个线程运行lambda时,它将获得i的最新值,而不是创建它时的值。而是通过值来捕获它:
myThreads[i] = std::thread ( [&, i] { bQ.doWork(randomNumbers, i); });
更糟糕的是,由于您对i
进行了无序读写操作,因此您当前的代码具有未定义的行为。事实上 i 可能会在另一个线程读取它之前超出主线程的范围。上面的修复解决了所有这些问题。