用三个线程按顺序循环打印ABC三个字母

摘要:
注意,C++11没有信号量。
  • 有两种方法:semaphore信号量和mutex互斥锁。需要注意的是C++11已经没有semaphore。
    • C++ 并发编程(六):信号量(Semaphore) - 止于至善 - SegmentFault 思否
      • https://segmentfault.com/a/1190000006818772
  • 线程按顺序执行(迅雷笔试题) - CSDN博客
    • http://blog.csdn.net/mafuli007/article/details/8488534
  • mutex - C++ Reference
    • http://www.cplusplus.com/reference/mutex/mutex/
用三个线程按顺序循环打印ABC三个字母第1张用三个线程按顺序循环打印ABC三个字母第2张
 1 //
 2 //  main.cpp
 3 //  LeetCode
 4 //
 5 //  Created by Hao on 2017/3/16.
 6 //  Copyright © 2017年 Hao. All rights reserved.
 7 //
 8 #include <iostream>       // std::cout
 9 #include <thread>         // std::thread, std::this_thread::sleep_for
10 #include <chrono>         // std::chrono::seconds
11 #include <mutex>          // std::mutex
12 
13 std::mutex mtx;           // mutex for critical section
14 int count = 0;
15 int num_count = 0;
16 
17 void print_block_0 (int n) {
18     // critical section (exclusive access to std::cout signaled by locking mtx):
19     while (true) {
20         if (count % 3 == 0) {
21             mtx.lock();
22             
23             ++ count;
24             
25             std::cout << "A" << std::endl;
26             
27             mtx.unlock();
28         }
29 
30         if (num_count == 3) break;
31     }
32 }
33 
34 void print_block_1 (int n) {
35     // critical section (exclusive access to std::cout signaled by locking mtx):
36     while (true) {
37         if (count % 3 == 1) {
38             mtx.lock();
39             
40             ++ count;
41             
42             std::cout << "B" << std::endl;
43 
44             mtx.unlock();
45         }
46 
47         if (num_count == 3) break;
48     }
49 }
50 
51 void print_block_2 (int n) {
52     // critical section (exclusive access to std::cout signaled by locking mtx):
53     while (true) {
54         if (count % 3 == 2) {
55             mtx.lock();
56             
57             ++ num_count;   // must be executed prior to the following statement, or else an extra "A" would be printed
58 
59             ++ count;
60 
61             std::cout << "C" << std::endl;
62             
63 //            std::this_thread::sleep_for (std::chrono::seconds(1)); // sleep in case that an extra "A" is printed
64             
65             mtx.unlock();
66         }
67         
68         if (num_count == 3) break;
69     }
70 }
71 
72 int main()
73 {
74     std::thread threads[3];                         // default-constructed threads
75     
76     std::cout << "Spawning 3 threads...
";
77     
78     threads[0] = std::thread(print_block_0, 10);   // move-assign threads
79     threads[1] = std::thread(print_block_1, 10);   // move-assign threads
80     threads[2] = std::thread(print_block_2, 10);   // move-assign threads
81 
82     std::cout << "Done spawning threads. Now waiting for them to join:
";
83     for (int i=0; i<3; ++i)
84         threads[i].join();
85     
86     std::cout << "All threads joined!
";
87     
88     return 0;
89 }
View Code

免责声明:文章转载自《用三个线程按顺序循环打印ABC三个字母》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何使用Fiddler抓取APP接口和微信授权网页源代码关于chrome等浏览器不支持showModalDialog的解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS图片压缩

项目中常会遇到,上传图片的操作,由于iPhone手机直接拍照的图片往往比较大,一般3-4M,如果直接上传不做处理会浪费用户很多流量,再者有很多场景并不需要高清图片,所以在上传图片前对图片进行压缩,是很有必要的。 1.OC中的UIKit中提供了现成的压缩函数UIImageJPEGRepresentation(UIImage * __nonnull image...

eigen 四元数

Eigen中四元数Quaterniond的初始 Eigen::Quaterniond q1(w, x, y, z);// 第一种方式 Eigen::Quaterniond q2(Vector4d(x, y, z, w));// 第二种方式 Eigen::Quaterniond q2(Matrix3d(R));// 第三种方式 #include <io...

VTK 空间几何变换(Transform),平移、旋转和缩放

先看下面的模型,这是一个Cow的三维模型, 在使用中,你是否会有下面的操作? 1.将Cow移动到某个位置——平移 2.转动到Cow背面——旋转 3.改变它大小——缩放 等等 可能你会说,这还不简单,通过操作相机就好了。然而并不是这样,操作相机,只使得相机的空间位置发生了变化,对三维物体并没有改变,要想改变模型,就需要对模形本身做空间变换。 空间变换的基础...

C++枚举变量与switch

转载:https://www.cnblogs.com/banmei-brandy/p/11263927.html 枚举类型和变量如何定义,下篇博客讲得十分详细: https://blog.csdn.net/bruce_0712/article/details/54984371 有几个需要注意的点: (1)在不进行强制类型转换的前提下,枚举量只能由枚举类型赋...

【C++】map容器的用法

检测map容器是否为空: 1 #include <iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 //检测容器是否为空 8 map<string, strin...

【C++】解决c++中cout输出中文乱码问题

问题:cout输出中文乱码。例如下面的代码输出会乱码。 cout << "成功!" << endl; 输出结果:  解决方案: 控制台还原旧版即可,打开程序->右键->属性->使用旧版控制台->重启程序->解决!...