Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 临界截面失效_C++_Multithreading_Winapi - Fatal编程技术网

C++ 临界截面失效

C++ 临界截面失效,c++,multithreading,winapi,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.joi

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

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

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

您的问题是静态变量,而不是临界部分。静态变量初始化只执行一次,然后不再执行赋值

你想写的是:

static int set_on_entry = 0;//or whatever value, will be overwritten
set_on_entry = set;

您的
static int set\u on\u entry=set仅由第一个线程执行一次。然后,其他3个线程将分别检查
if(0!=1)、if(0!=2)、if(0!=3)
,这三个线程的计算结果显然都是
true

如果您想在每个线程上设置一个
线程条目
,请使用
线程本地

static thread_local int set_on_entry = set;

无效修改
??你可以发布进入/离开部分的代码吗?“void void”是一个拼写错误-现在已修复。当你说发布代码-你是指“//在这里做一大堆工作”部分吗?有很多!首先,你的临界区似乎很大。它不应该是,它应该尽可能小,否则线程之间就不会有并行性。如果您需要一些共享数据,只需在本地提取(复制)它,然后离开关键部分处理数据。其次,您的问题很可能出现在代码中您没有向我们展示的部分。为什么不可能呢
set\u on_entry
由进入临界段的第一个线程初始化,其他线程具有不同的
set
s。这有什么奇怪的?静态只由第一个线程初始化一次,其他3个线程只检查一个不同的值,这些值不匹配。