//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// 信号量的使用
//
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <process.h>
#include <cstdio>
#include <time.h>
HANDLE g_hSem ; // 信号量
HANDLE g_hMutex; // 互斥体
DWORD g_Array[ 10 ];
#define COLOR_GREEN 0xa
#define COLOR_WHITE 0xf
// 带颜色打印字符串
void print( int Color, const char* pFormat,...)
{
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ) , Color );
va_list va;
va_start( va , pFormat );
vprintf( pFormat , va );
va_end( va );
}
// 读者线程
unsigned int __stdcall readerProc( void* pArg )
{
int nIndex = 0;
while( true ) {
// 判断是否有写入信号
// ReleaseSemaphore返回FALSE说明还没有写入数据的线程在工作
if( FALSE == ReleaseSemaphore( g_hSem , 1 , 0 ) ) { //ReleaseSemaphore这个函数可以加信号,当然,
//如果信号的个数处于最大的时候,它是不会加的,本程序一开始的时候,信号有五个
print( COLOR_WHITE , "[%d]没有数据读了\n" , GetThreadId( GetCurrentThread( ) ) );
}
else {
// 写的时候不能读, 等待互斥体(1)
WaitForSingleObject( g_hMutex , -1 );
print( COLOR_WHITE , "[%d]读取数据:%d\n" , GetThreadId( GetCurrentThread( ) ),g_Array[0] );
Sleep( 1000 );
// 释放互斥体
ReleaseMutex( g_hMutex );//(2),一和二之间的代码是在 互斥体里面的,我们命名为互斥体1,另外 writerProc这个线程里面也有一个互斥体
//这两个互斥体里面的代码是不能被同时访问的!!!!!!
// 休息一下
}
Sleep( 500 ); //这句话可以注释掉看一看,会对程序有很大影响
}
return 0;
}
// 写 线程
unsigned int __stdcall writerProc( void* pArg )
{
DWORD nIndex = 0;
while( true ) {
// 写的时候不能读, 等待写入事件被触发
WaitForSingleObject( g_hSem , -1 ); //这个函数使得信号减1,另外,如果没有信号(上面一个线程里面有加信号的函数)
//那么线程将一直被阻塞,除非上面线程的ReleaseSemaphore执行,使得信号加1
//然后它才可以执行"减一"这个操作
// 开始要写入数据, 写和读不能同时进行, 等待互斥体.
WaitForSingleObject( g_hMutex , -1 );
g_Array[ 0 ] = rand()%50;
print( COLOR_GREEN , "[%d] --------- 写入数据:%d --------- \n" , GetThreadId( GetCurrentThread( ) ),g_Array[0] );
// 休息一下
Sleep( 1000 );
// 释放互斥体
ReleaseMutex( g_hMutex );
}
return 0;
}
int main( )
{
srand( time( NULL) );
g_hSem = CreateSemaphore( NULL ,
5 , // 有信号的个数
5 , // 最大的信号个数
NULL );
g_hMutex = CreateMutex( NULL , FALSE , NULL );
// 创建3个线程
HANDLE phTread[ 3 ];
phTread[ 0 ] = (HANDLE)_beginthreadex( 0 , 0 , readerProc , 0 , 0 , 0 );
//phTread[ 1 ] = (HANDLE)_beginthreadex( 0 , 0 , readerProc , 0 , 0 , 0 );
phTread[ 1 ] = (HANDLE)_beginthreadex( 0 , 0 , writerProc , 0 , 0 , 0 );
phTread[ 2 ] = (HANDLE)_beginthreadex( 0 , 0 , writerProc, 0, 0, 0);
WaitForMultipleObjects( _countof(phTread), phTread , TRUE , -1 );
return 0;
}
信号量
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 信号量用于线程同步,互斥量用户保护资源的互斥访问。 信号量与互斥量的区别 互斥量用于线程的互斥,信号线用于线程的同...