【win32下多线程同步方式之临界区,互斥量,事件对象,信号量】少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述win32下多线程同步方式之临界区,互斥量,事件对象,信号量相关的知识,希望能为你提供帮助。
// win32_thread_syn.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "list"
#include "windows.h"
#include "process.h"
using namespace std;
/*
线程同步
1.临界区
2.信号量
3.事件对象
4.互斥量
*/
/************************************************************************/
/* 临界区单进程内线程同步*/
/************************************************************************/
CRITICAL_SECTION g_cri; //临界区
list< int> g_list2;
unsigned int __stdcall threadRead(LPVOID param)
while(true)
EnterCriticalSection(& g_cri);
for (list< int> ::iterator it = g_list2.begin(); it != g_list2.end(); it++)
cout < < "元素为:"< < *it < < endl;
LeaveCriticalSection(& g_cri);
Sleep(100);
return 0;
unsigned int __stdcall threadWrite(LPVOID param)
srand(GetTickCount());
while (true)
EnterCriticalSection(& g_cri);
if (g_list2.size()> 0)
if (rand() % 100 > 50)
g_list2.push_back(rand());
else
g_list2.erase(g_list2.begin());
else
g_list2.push_back(rand());
LeaveCriticalSection(& g_cri);
Sleep(100);
return 0;
HANDLE g_mutex; //互斥量
unsigned int times = 0;
/************************************************************************/
/*互斥量*/
/************************************************************************/
unsigned int __stdcall firstThread(LPVOID param)
while (true)
WaitForSingleObject(g_mutex, INFINITE);
if (times < =20)
cout < < "线程1的第" < < times++ < < "次.." < < endl;
else
break;
ReleaseMutex(g_mutex);
return 0;
unsigned int __stdcall secondThread(LPVOID param)
while (true)
WaitForSingleObject(g_mutex, INFINITE);
if (times < = 20)
Sleep(1);
cout < < "线程2的第" < < times++ < < "次.." < < endl;
else
break;
ReleaseMutex(g_mutex);
return 0;
/************************************************************************/
/* 事件对象可对进程外的线程同步
CreateEvent(NULL, false, false, NULL);
setEvent(g_event);
*/
/************************************************************************/
HANDLE g_event;
unsigned int __stdcall firstThread2(LPVOID param)
while (true)
WaitForSingleObject(g_event, INFINITE);
if (times < = 20)
cout < < "线程1的第" < < times++ < < "次.." < < endl;
else
break;
SetEvent(g_event);
return 0;
unsigned int __stdcall secondThread2(LPVOID param)
while (true)
WaitForSingleObject(g_event, INFINITE);
if (times < = 20)
Sleep(1);
cout < < "线程2的第" < < times++ < < "次.." < < endl;
else
break;
SetEvent(g_event);
return 0;
/************************************************************************/
/* 信号量主要是可以指定个数
允许多个线程同一时刻访问同一资源,我们可以指定允许个数
*/
/************************************************************************/
HANDLE g_semaphore;
unsigned int __stdcall firstThread3(LPVOID param)
while (true)
WaitForSingleObject(g_semaphore, INFINITE);
if (times < = 20)
cout < < "线程1的第" < < times++ < < "次.." < < endl;
else
break;
ReleaseSemaphore(g_semaphore, 1, NULL);
return 0;
unsigned int __stdcall secondThread3(LPVOID param)
while (true)
WaitForSingleObject(g_semaphore, INFINITE);
if (times < = 20)
Sleep(1);
cout < < "线程2的第" < < times++ < < "次.." < < endl;
else
break;
ReleaseSemaphore(g_semaphore, 1, NULL);
return 0;
int _tmain(int argc, _TCHAR推荐阅读
- google开源库glog源码实现分析
- ACE之Proactor模式使用实例
- ACE之Reactor模式使用实例
- C++使用ICE实现两台主机通信实例
- #导入Word文档图片# Linux下信号处理
- opencv 绘图及交互(python)
- linux下遍历目录和文件,删除过期天数目录或文件shell脚本
- Spring Cloud原理详解
- SSD+HDD双硬盘+MSI主板win8.1+ubuntu17.04双系统安装总结