用三个线程按顺序循环打印ABC三个字母
- 有两种方法:semaphore信号量和mutex互斥锁。需要注意的是C++11已经没有semaphore。
- C++ 并发编程(六):信号量(Semaphore) - 止于至善 - SegmentFault 思否
- https://segmentfault.com/a/1190000006818772
- C++ 并发编程(六):信号量(Semaphore) - 止于至善 - SegmentFault 思否
- 线程按顺序执行(迅雷笔试题) - CSDN博客
- http://blog.csdn.net/mafuli007/article/details/8488534
- mutex - C++ Reference
- http://www.cplusplus.com/reference/mutex/mutex/
//
// main.cpp
// LeetCode
//
// Created by Hao on 2017/3/16.
// Copyright © 2017年 Hao. All rights reserved.
//
#include <iostream> // std::cout
#include <thread> // std::thread, std::this_thread::sleep_for
#include <chrono> // std::chrono::seconds
#include <mutex> // std::mutex std::mutex mtx; // mutex for critical section
int count = ;
int num_count = ; void print_block_0 (int n) {
// critical section (exclusive access to std::cout signaled by locking mtx):
while (true) {
if (count % == ) {
mtx.lock(); ++ count; std::cout << "A" << std::endl; mtx.unlock();
} if (num_count == ) break;
}
} void print_block_1 (int n) {
// critical section (exclusive access to std::cout signaled by locking mtx):
while (true) {
if (count % == ) {
mtx.lock(); ++ count; std::cout << "B" << std::endl; mtx.unlock();
} if (num_count == ) break;
}
} void print_block_2 (int n) {
// critical section (exclusive access to std::cout signaled by locking mtx):
while (true) {
if (count % == ) {
mtx.lock(); ++ num_count; // must be executed prior to the following statement, or else an extra "A" would be printed ++ count; std::cout << "C" << std::endl; // std::this_thread::sleep_for (std::chrono::seconds(1)); // sleep in case that an extra "A" is printed mtx.unlock();
} if (num_count == ) break;
}
} int main()
{
std::thread threads[]; // default-constructed threads std::cout << "Spawning 3 threads...\n"; threads[] = std::thread(print_block_0, ); // move-assign threads
threads[] = std::thread(print_block_1, ); // move-assign threads
threads[] = std::thread(print_block_2, ); // move-assign threads std::cout << "Done spawning threads. Now waiting for them to join:\n";
for (int i=; i<; ++i)
threads[i].join(); std::cout << "All threads joined!\n"; return ;
}
用三个线程按顺序循环打印ABC三个字母的更多相关文章
- 多线程面试题之【三线程按顺序交替打印ABC的方法】
建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:&q ...
- Java多线程循环打印ABC的5种实现方法
https://blog.csdn.net/weixin_39723337/article/details/80352783 题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环 ...
- python 多线程实现循环打印 abc
python 多线程实现循环打印 abc 好久没写过python了, 想自己实践一下把 非阻塞版 import threading import time def print_a(): global ...
- 多个线程分别顺序交替打印一种不同字符abcdefg(已实现随便多少个线程打印多少个字符,利用线程池实现多线程)
下面实现多线程顺序打印字符"abcdefg": 实现Runnable接口: /** * @author: rhyme * @date: 2019-08-17 14:39 * @to ...
- 多线程循环打印ABC
主要是利用线程的wait()和notify()来实现 public class MyThread implements Runnable { private String name; private ...
- 【快手初面】要求3个线程按顺序循环执行,如循环打印A,B,C
[背景]这个题目是当时远程面试时,手写的题目.自己比较惭愧,当时写的并不好,面试完就又好好的完善了下. 一.题意分析 3个线程要按顺序执行,就要通过线程通信去控制这3个线程的执行顺序. 而线程通信的方 ...
- 三个线程abc顺序执行
1.使用synchronized悲观锁(秋招阿里的一个笔试题,应该写的比较复杂,然后就没有然后了o(╥﹏╥)o) public class ThreadThreadp { private int fl ...
- java Semaphore实现ABC三个线程循环打印
Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...
- 三个线程T1,T2,T3.保证顺序执行的三种方法
经常看见面试题:有三个线程T1,T2,T3,有什么方法可以确保它们按顺序执行.今天手写测试了一下,下面贴出目前想到的3种实现方式 说明:这里在线程中我都用到了sleep方法,目的是更容易发现问题.之前 ...
随机推荐
- ORA-01034:Oracle not available
ORA-01034:Oracle not available 问题描述:ora-01034常与ora-27101同时出现,都是在登录数据库的时候报该错误 错误原因:出现ORA-01034和ORA-27 ...
- L1-027 出租
下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对 ...
- KBMMW 的日志管理器
kbmmw 4.82 最大的新特性就是增加了 日志管理器. 新的日志管理器实现了不同类型的日志.断言.异常处理.计时等功能. 首先.引用kbmMWLog.pas 单元后,系统就默认生成一个IkbmMW ...
- Linux tomcat自动启动
1.编辑/etc/rc.d/rc.local 添加环境变量 例如: JAVA_HOME=/usr/local/java/JRE_HOME=/usr/local/java/jreCLASS_PATH=. ...
- 清除的通用样式 css
/*公共样式--开始*/ html, body, div, ul, li, h1, h2, h3, h4, h5, h6, p, dl, dt, dd, ol, form, input, textar ...
- delphi批量存入多媒体字段 遇到内存溢出的坑
最近delphi做一个小工具其中一个需求要把上W张照片存入数据库多媒体字段. 程序转到1,2W的时候即内在溢出了.最多一次转了3W张照片.很简单的一段代码后来仔细检查发现其中的坑. 下面放上代码 wi ...
- CodeForces - 1093G:Multidimensional Queries (线段树求K维最远点距离)
题意:给定N个K维的点,Q次操作,或者修改点的坐标:或者问[L,R]这些点中最远的点. 思路:因为最后一定可以表示维+/-(x1-x2)+/-(y1-y2)+/-(z1-z2)..... 所以我们可以 ...
- POJ:2386 Lake Counting(dfs)
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40370 Accepted: 20015 D ...
- HDU 1234:开门人和关门人
开门人和关门人 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- IIS 使用 HTTP/2
什么叫HTTP/2? HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis ...