/**************************************************************/
//多个线程交替执行输出各自的符号,本工程为方便支持26个线程,可循环
//执行很多次....看个人电脑配置。
//事件event + 临界区CriticalSection实现(使用标识量实现,略显繁琐)
//请参考AlternateThreadForN2.h 和AlternateThreadForNNew.h的更简单实现
//注意为了防止变量二义性,在main函数中三个头文件每次只能包含一个
//C++ demo
//作者:don_lvsml 2014.3.11
//包含该头文件,在main函数里调用AlternateThread();即可。
/**************************************************************/
#pragma once
#include<assert.h>
#include<Windows.h>
#include<process.h>
#include<iostream>
using namespace std;
const int n = 20;//最大线程数,最好不要超过maxn
const int maxn = 26;//最大符号数,此处从A-Z
const int count = 20;//每个线程循环次数
char str[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
HANDLE g_event;//全局事件,用于主从线程同步
CRITICAL_SECTION g_cs;//临界区变量,用于子线程之间互斥
HANDLE m_event[n];//触发每个子线程的事件
bool flag[n];//每个子线程的标识量,决定其等待还是运行
HANDLE m_thread[n];//子线程
unsigned int __stdcall AlterFun(LPVOID pm)
{
int id = *(int *)pm;//取出当前线程ID
SetEvent(g_event);
Sleep(50);
for(int i = 0;i < count;i++)
{
int next = (id + 1) == n ? 0 : id + 1;//用于触发下一线程
//int pre = id - 1 < 0 ? n - 1 : id - 1;//用于输出字符,线程1最先运行,应该输出str[0],而线程0输出str[n-1]
//SetEvent(m_event[next]);
WaitForSingleObject(m_event[id],INFINITE);//等待当前线程被触发
//while(!flag[id])//当前线程标识量有效就运行,否则一直等待
// Sleep(0);
EnterCriticalSection(&g_cs);//进入临界区
//flag[id] = false;//设置当前线程标识量为无效
//flag[next] = true;//设置下一线程标识量为有效
cout<<str[id];
if(id == n - 1)
cout<<endl;
LeaveCriticalSection(&g_cs);//离开临界区
SetEvent(m_event[next]);
Sleep(10);//触发下一个线程的事件
}
return 0;
}
void AlternateThread()
{
assert(n <= maxn && n >= 2);//至少2个线程,最多maxn个线程(最多数目是为了保证每个线程输出字符不一样)
cout<<"多线程交替执行,多次循环,C++ demo"<<endl;
cout<<"作者:don_lvsml"<<endl;
cout<<"运行线程数为"<<n<<",每个线程循环次数为"<<count<<endl;
g_event = CreateEvent(NULL,false,false,NULL);//自动置位事件
m_event[0] = CreateEvent(NULL,false,TRUE,NULL);//自动置位事件,第一个事件有初始状态,不用等待
for(int i = 1;i < n;i++)
{
m_event[i] = CreateEvent(NULL,false,false,NULL);//自动置位事件
//flag[i] = false;
}
//flag[1] = true;//从线程1最先开始运行,其输出A,而在线程0里触发m_event[1]
InitializeCriticalSection(&g_cs);//初始化临界区
for(int i = 0;i < n;i++)
{
m_thread[i] = (HANDLE) _beginthreadex(NULL,0,AlterFun,&i,0,NULL);
WaitForSingleObject(g_event,INFINITE);//等待子线程触发
}
WaitForMultipleObjects(n,m_thread,true,INFINITE);//等待子线程运行完
//清理内核
for(int i = 0;i > n;i++)
CloseHandle(m_event[i]);
CloseHandle(g_event);
DeleteCriticalSection(&g_cs);
}
多线程交替执行输出ABCDEF...
需积分: 34 181 浏览量
2014-03-13
21:03:43
上传
评论
收藏 5KB ZIP 举报
don_lvsml
- 粉丝: 14
- 资源: 1
最新资源
- mosquitto-2.018-install-windows-x64
- FTPServer FTP 服务器,绿色免安装,单文件
- 梦畅语音点名软件,上课点名
- 利用ADNI数据集和标签,在tensorflow框架上使用tensorlayer接口,通过架构u-net实现海马体的分割
- Kutools for Word v9.0 office word 插件
- 修复Windows 10 LTSC 2021资源占用率高
- Hash工具,小巧绿色hash校验工具,免费hash工具
- 重启进行BIOS快捷方式,不需要开机按BIOS键
- 鸭子开车记(儿童绘本)
- 威纶通触摸屏编程软件Easy builder pro V6.09.01.556安装包(2024.04).txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈