【发布时间】:2016-07-08 15:55:52
【问题描述】:
简单的代码(我知道这是一个非常糟糕的代码,但我只是为了示例):
1 #include <mutex>
2 #include <iostream>
3 #include <thread>
4
5 std::mutex mu;
6
7 void myFunc(void) {
8 for (int i = 0; i < 100; ++i) {
9 mu.lock();
10 std::cout << "CHILD Thread: " << std::this_thread::get_id() << std::endl;
11 mu.unlock();
12 }
13 }
14
15 int main()
16 {
17 std::thread thr(myFunc);
18 for (int i = 0; i < 100; ++i) {
19 mu.lock();
20 std::cout << "MAIN Thread: " << std::this_thread::get_id() << std::endl;
21 mu.unlock();
22 }
23 thr.join();
24 return 0;
25 }
返回这种输出:
1 MAIN Thread: 140581832210240
2 MAIN Thread: 140581832210240
3 MAIN Thread: 140581832210240
4 MAIN Thread: 140581832210240
5 MAIN Thread: 140581832210240
6 MAIN Thread: 140581832210240
7 MAIN Thread: 140581832210240
8 CHILD Thread: 140581814855424
9 CHILD Thread: 140581814855424
10 CHILD Thread: 140581814855424
11 CHILD Thread: 140581814855424
12 CHILD Thread: 140581814855424
13 CHILD Thread: 140581814855424
14 CHILD Thread: 140581814855424
15 CHILD Thread: 140581814855424
16 CHILD Thread: 140581814855424
17 CHILD Thread: 140581814855424
18 MAIN Thread: 140581832210240
19 MAIN Thread: 140581832210240
20 MAIN Thread: 140581832210240
21 MAIN Thread: 140581832210240
22 MAIN Thread: 140581832210240
23 CHILD Thread: 140581814855424
24 CHILD Thread: 140581814855424
25 CHILD Thread: 140581814855424
26 CHILD Thread: 140581814855424
27 CHILD Thread: 140581814855424
28 CHILD Thread: 140581814855424
29 CHILD Thread: 140581814855424
....... and so on
正如我所见——这个输出违背了多线程的含义,因为一个线程必须等待另一个线程很长时间。这个输出应该同时给我 cout of child、cout of main、cout of child、cout of main 等等。我知道互斥锁不负责公平共享公共资源,但是:谁是?我如何在我的程序中实现它?
谢谢。
编辑:将 std::cout 放入函数中:
10 void common_cout(string msg) {
11 mu.lock();
12 std::cout << msg << std::endl;
13 mu.unlock();
14 }
没有帮助。
【问题讨论】:
-
所有线程不应该使用相同的内存空间。这就是为什么你必须使用锁等等。平均分配空间,以便第一个线程将使用 1/number_of_threads 块内存。在这种情况下,您甚至不需要使用锁定机制。还要检查您的 CPU 上可以运行多少线程。运行超过 CPU 支持的线程是没有意义的。
标签: c++ multithreading mutex