【发布时间】:2011-01-19 10:03:54
【问题描述】:
我有两个共享的全局变量
int a = 0;
int b = 0;
还有两个线程
// thread 1
for (int i = 0; i < 10; ++i) {
EnterCriticalSection(§);
a++;
b++;
std::cout << a " " << b << std::endl;
LeaveCriticalSection(§);
}
// thread2
for (int i = 0; i < 10; ++i) {
EnterCriticalSection(§);
a--;
b--;
std::cout << a " " << b << std::endl;
LeaveCriticalSection(§);
}
代码总是打印以下输出
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
这很奇怪,看起来线程是按顺序工作的……这是什么问题?
谢谢。
【问题讨论】:
-
你为什么觉得它很奇怪?当你启动第二个线程时,第一个线程可能已经完成了它的工作。
-
是的,实际上是有可能的,但是同样的输出也包含大量的数据,并且对于另一个互斥对象(例如 std::mutex),它的工作方式就像预期的那样。
-
刚刚测试了 10000 个增量/减量。是的,你是对的,这就是原因,但无论如何它的工作原理很奇怪,看起来它没有给两个线程大约相等的时间..差异很大,我可以看到它增加值超过一秒钟..
-
顺便说一句,如果您使用 C++(如标签所示),最好将
CCriticalSection与CSingleLock一起使用,这样您就有了异常安全性。 -
@Naveen:并非所有 C++ 代码都使用 MFC(感谢上帝!)。 :)
标签: c++ winapi mutex critical-section