线程执行在IDE中是否与C ++中的exe应用程序不同?

时间:2017-03-07 06:11:15

标签: c++ multithreading c++11 concurrency codeblocks

我是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文件,它通过剥离符号来减小文件大小。

1 个答案:

答案 0 :(得分:0)

在IDE中运行时,线程之间的时间可能会有所不同,在外部,xould在一个环境中比另一个环境更容易暴露竞争条件。

使用/不使用优化构建也会改变时间并且也可能暴露错误。

在任何情况下,如果没有SSCCE,就无法说出你的错误,但是我的水晶球说你的代码中可能存在数据竞争。

你确定这个while (con_read_q.try_dequeue(item)是线程安全的吗?