关键部分失败

时间:2016-09-19 08:53:42

标签: c++ multithreading winapi

几年前我成功地使用过关键部分,但我对这一切工作原理的记忆却相当淡淡。我需要再次使用它们,所以我从我的一个旧项目中剪切并粘贴了一些代码并创建了以下内容,其中包括一个测试以确保其按预期工作:

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);
}

令我惊讶的是我收到了消息"线程失败!!"当我运行代码。我以为这是不可能的。我忘了什么吗?

2 个答案:

答案 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;