void function_x()
{
thread t1(modify, 0);
thread t2(modify, 1);
thread t3(modify, 2);
thread t4(modify, 3);
t1.join();
t2.join();
t3.join();
t4.join();
}
void modify(int set)
{
// InitializeCriticalSection(&critsecA); already done early in WinWain()
// misc code here
blah blah blah, loops etc.
EnterCriticalSection(&critsecA);
static int set_on_entry = set;
// do a bunch of work here
blah blah blah, loops etc.
if (set_on_entry != set)
{
error_report("Thread fail!!");
}
LeaveCriticalSection(&critsecA);
}
令我惊讶的是我收到了消息"线程失败!!"当我运行代码。我以为这是不可能的。我忘了什么吗?
答案 0 :(得分:4)
您的static int set_on_entry = set;
仅由第一个帖子执行一次。然后,其他3个线程将分别检查if(0 != 1), if(0 != 2), if(0 != 3)
,显然将全部评估为true
。
如果您想为每个帖子使用set_on_entry
thread_local
:
static thread_local int set_on_entry = set;
答案 1 :(得分:1)
您的问题在于静态变量,而不是您的关键部分。静态变量初始化仅执行一次,然后不再执行分配。
你想写的是:
static int set_on_entry = 0;//or whatever value, will be overwritten
set_on_entry = set;