2017-03-07 42 views
-2

我是C++线程的新手。我使用Code:blocks在C++ 11中开发了一个多线程应用程序。线程执行是否在IDE中与C++中的EXE应用程序不同?

应用程序接缝执行和完美工作(程序启动,将任务分成线程,任务完成后,然后打印信息,然后退出)从代码块。

但是,在使用代码块生成exe文件后,单独从命令行运行exe文件后,程序将像以前一样工作,直到任务完成,但完成所有任务后,线程无法退出并且继续下一步。

在代码中运行程序:blocks和outside应该是相同的。我在下面添加了执行线程函数的分割任务函数。我已经使用下面的函数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

也许你的代码有缺陷。 [Mcve] –

+0

您的代码不完整;特别是它似乎缺少'main()'函数和至少一个'#include'。请[编辑]你的代码,这是你的问题[mcve],然后我们可以尝试重现并解决它。你还应该阅读[问]。 –

回答

0

在IDE中运行时,线程之间的时间可能会有所不同,在此之外,与其他环境相比,更容易在一个环境中暴露竞态条件。

有/无优化的构建也会改变时间安排并且也可能暴露错误。

在任何情况下,如果没有SSCCE,就不可能说出你的情况有什么问题,但是我的水晶球说你可能在你的代码中有数据竞争。

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

+0

是的,我明白。我没有比赛条件,因为我第一次加载所有需要处理的数据,然后处理阶段开始。在调用divide_task方法之前,队列具有所需的所有数据。moodycamel :: ConcurrentQueue具有try_dequeue(item),它是一个线程安全函数。 – Balaram26

相关问题