c++多线程 实现多线程顺序输出ABCD

要求: 有四个线程,线程1只输出A,线程2只输出B,如此类推。现需要让这四个线程按顺序输出ABCDABCD........

1.首先我们可以先定义线程运行函数,只要不断输出所需要的字母就可以了。


 1 int count = 0;
2 DWORD WINAPI function(LPVOID pm)
3 {
4 int tmp = (int)pm;
5 char c = ‘A‘ + tmp;
6 while (true)
7 {
8 if (count >= 100)
9 {
10 break;
11 }
12 printf("%d curThread:%c count = %d\n", tmp, c, count);
13 count++;
14 }
15 return 0;
16 }

2.然后在main函数创建4个线程,并启动,就会不断输出字母。


int main()
{
for (int i = 0; i < 4; i++)
{
hl[i] = CreateThread(NULL, 0, function, (void *)i, 0, NULL);
}
Sleep(10000);
return 0;
}

但是如何做到按顺序呢,这就需要挂起线程,并让下一个线程运行。当下一个线程运行完一次循环,再挂起,让第三个线程运行,如此循环下去。

可以使用 WaitForSingleObject 来挂起线程,并设置时限为INFINITE,直到所等待线程接收到信号才继续执行。

可以使用SetEvent来给线程标志信号,和WaitForSingleObject配合使用。

同时,需要一些辅助的Event来让输出字符的线程等待。

(如果不使用辅助的Event,比如直接让线程A等待线程D,线程B等待线程A,线程C等待线程B,线程D等待线程C,这样会造成一个死循环,会死锁。

如果直接自己等待自己,然后用SetEvent来让下一个线程跑起来,逻辑上是没错的,但是在线程创建阶段,需要等待的线程都可能没创建起来就开始等待了,结果是线程等待着一个空的HANDLE没法再起来了。)

具体看代码吧:


#include <stdio.h>
#include <Windows.h>

char s[100];
int count;
HANDLE handler[4];
HANDLE hl[4];
DWORD WINAPI function(LPVOID pm)
{
int tmp = (int)pm;
char c = ‘A‘ + tmp;
while (true)
{
WaitForSingleObject(handler[tmp], INFINITE);
if (count >= 100)
{
break;
}
printf("%d curThread:%c count = %d\n", tmp, c, count);
s[count] = (char)pm;
count++;
Sleep(100);
SetEvent(handler[(tmp+1)%4]);
}
return 0;
}

int main()
{
for (int i = 0; i < 4; i++)
{
handler[i] = CreateEvent(NULL, false, false, NULL);
hl[i] = CreateThread(NULL, 0, function, (void *)i, 0, NULL);
}
printf("start\n");
SetEvent(handler[0]);
WaitForMultipleObjects(4, handler, true, INFINITE);
printf("done!\n");
return 0;
}

c++多线程 实现多线程顺序输出ABCD

时间: 2024-08-25 06:06:12

c++多线程 实现多线程顺序输出ABCD的相关文章

iOS开发多线程篇—多线程简单介绍

iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程

iOS开发之多线程篇 多线程简介

iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程的

iOS开发多线程篇—多线程简介

iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"能够查看Mac系统中所开启的进程 2.什么是线程 1个进程要想运行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本运行单元,一个进程(程序)的全部任务都在线程中运行 比方使用酷狗播放音乐.使用迅雷下载电影,都须要在线程中

iOS多线程技术—多线程简单介绍

iOS多线程技术—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程的

三个线程顺序输出

一.join介绍 Thead.join()函数在使用后,会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行.源码中调用join后,方法会一直检测要join()的线程是否存活(isAlive()方法),直到线程执行完成后,调用线程的this.notifyAll()方法,才会回到刚刚挂起的主程序.基本操作如下: public class Worker extends Thread { // 工作者名 private String name; // 工作时间 private long tim

iOS开发多线程篇—多线程的的相关概念(1)

iOS开发多线程篇-多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行

iOS开发多线程网络———多线程概念及GCD

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(htt

Java多线程——&lt;八&gt;多线程其他概念

一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 Java多线程——<三>简单的线程执行:Executor Java多线程——<四>让线程有返回值 Java多线程——<五>后台线程(daemon) Java多线程——<六>更方便的线程 Java多线程——<七>多线程的异常捕捉 均是个人理解和总结,代

【C语言】用指针数组完成:将若干字符串安字母顺序输出

//用指针数组完成:将若干字符串安字母顺序输出 #include <stdio.h> #include <string.h> void print(char * name[],int n) //char * name[],指针数组,每个数组元素是一个char*(即字符串)类型 { int i; for(i=0;i<n;i++) { printf("%s\n",name[i]); } } void sort(char *name[],int n) { cha