【发布时间】:2014-06-16 15:17:10
【问题描述】:
我在 C++ 中有奇怪的情况(至少对我来说:D)
我的代码是:
static void startThread(Object* r){
while(true)
{
while(!r->commands->empty())
{
doSomthing();
}
}
}
我使用 boost 将这个函数作为线程启动,其中 r 中的命令是队列...这个队列我在另一个线程中填充...
问题是,如果我先填满队列,然后开始这个步骤,一切正常......但是如果我先运行 startThread,然后填满队列命令,它就不起作用...... doSomething()不会运行...
如果我修改 startThread:
static void startThread(Object* r){
while(true)
{
std::cout << "c" << std::endl;
while(!r->commands->empty())
{
doSomthing();
}
}
}
我刚刚添加了 cout……它正在工作……谁能解释为什么它与 cout 一起工作而不是没有?或者有人知道可能出了什么问题?
也许编译器正在做某种优化?我不这么认为... :( 谢谢
【问题讨论】:
-
如果你只发送空队列,你的线程很快就会结束。当您打印时,您的父线程有机会填充队列。使用一些同步。如果您的队列不是线程安全的,则从 2 个线程更新队列可能会导致未定义的结果。
-
它正在与 cout 一起“工作”,因为您有一个错误,它导致的减速正在掩盖。首先,您需要使用某种同步机制来保护对队列的访问。
-
@Dusan Plavak -
But if I run the startThread first这就是问题所在。你相信当你调用启动线程的函数时,线程函数会立即执行。这是一个错误的假设。如果不使用(甚至学习)正确的同步,例如信号量、互斥锁、原子操作等,你就无法编写多线程程序。 -
@PaulMcKenzie 我没有假设哪个线程先启动,我确保 startThread 先启动...无论如何,问题就像 Konrad Rudolph 所描述的那样,并提供了链接...
-
@DusanPlavak - 你是如何确保 startThread 函数首先启动的?您的问题不清楚您是如何启动该功能的。你是直接调用startThread函数吗?
startThread(); FillUpTheQueue();你做到了吗?还是您这样做了:callThreadedFunction( startThread ); fillUpTheQueue()?callThreadedFunction是一些启动线程的通用函数(不管是不是 boost)。
标签: c++ multithreading while-loop