我是C ++线程的新手。我使用Code:blocks在c ++ 11中开发了一个多线程应用程序。
应用程序接口执行并完美地工作(程序启动,将任务划分为线程,完成任务,然后打印信息,然后退出)来自代码块。
但是在使用代码块生成exe文件之后,并且在从命令行单独运行exe文件之后,程序将像以前一样工作直到任务完成,但是在完成所有任务后,线程无法退出并继续下一步。
在代码中运行程序:块和外部应该是相同的。我在下面添加了执行线程功能的除法任务功能。我已将moodycamel::ConcurrentQueue
用于下面的函数。
void divide_task(){
std::atomic<int> doneConsumers(0);
std::thread threads[cores_aval];
for (int i = 0; i != cores_aval; ++i) {
threads[i] = std::thread([&]() {
Item* item = new Read;
do{
while (con_read_q.try_dequeue(item)) {
//do something with hitem;
delete item;
}
}
while (doneConsumers.fetch_add(1, std::memory_order_acq_rel) + 1 == cores_aval);
});
}
}
更新:感谢您的回复。我在代码块中发现了构建选项设置的问题。发布分支中的一个编译器标志正在影响最终的exe文件,它通过剥离符号来减小文件大小。
答案 0 :(得分:0)
在IDE中运行时,线程之间的时间可能会有所不同,在外部,xould在一个环境中比另一个环境更容易暴露竞争条件。
使用/不使用优化构建也会改变时间并且也可能暴露错误。
在任何情况下,如果没有SSCCE,就无法说出你的错误,但是我的水晶球说你的代码中可能存在数据竞争。
你确定这个while (con_read_q.try_dequeue(item)
是线程安全的吗?