c++ - Windows 关键部分奇怪的行为

标签 c++ winapi mutex critical-section

我有两个共享的全局变量

int a = 0;
int b = 0;

和两个线程

// thread 1
for (int i = 0; i < 10; ++i) {
    EnterCriticalSection(&sect);
    a++;
    b++;
    std::cout << a " " << b << std::endl;
    LeaveCriticalSection(&sect);
}

// thread2
for (int i = 0; i < 10; ++i) {
    EnterCriticalSection(&sect);
    a--;
    b--;
    std::cout << a " " << b << std::endl;
    LeaveCriticalSection(&sect);
}

代码总是打印以下输出

1 1

2 2

3 3

4 4

5 5

6 6

7 7

8 8

9 9

10 10

9 9

8 8

7 7

6 6

5 5

4 4

3 3

2 2

1 1

0 0

这很奇怪,看起来线程是按顺序工作的。这有什么问题吗?

谢谢。

最佳答案

每个线程在被抢占之前都有一个特定的时间片执行。在您的示例中,时间片似乎比完成循环所需的时间长。

但是,您可以在将关键部分留在循环内后通过调用 Sleep(0) 主动放弃控制权。

关于c++ - Windows 关键部分奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4733915/

相关文章:

c++ - OpenACC 管理二维数据移动

c++ - 在 D3D12 上获取显示器的刷新率

c++ - 为什么对 BeginPaint() 的调用总是生成 WM_NCPAINT 消息?

c++ - 访问读取冲突C++任务计划程序

multithreading - 释放互斥锁 : Object synchronization method was called from an unsynchronized block of code

kotlin - 正确的互斥方式

c++ - 如何打印 C++ 中捕获的异常的堆栈跟踪和 C++ 中的代码注入(inject)

windows - 将工具栏放入 Windows 任务栏(ala 语言栏)

c++ - 向应用程序发送信号 (Windows)

c++ - openCV 和线程问题