一 临界区
1 相关问题
多个线程同时访问一段代码,例如:printf();
2 临界区
锁定一段代码,防止多个线程同时使用该代码。
3 使用方法
3.1 初始化临界区
void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) ; //LPCRITICAL_SECTION lpCriticalSection 临界区变量
3.2 进入临界区
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
3.3 离开临界区
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
3.4 删除临界区
void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
例子:
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
CRITICAL_SECTION cs = { 0 };//临界区变量//线程一
DWORD WINAPI TestProc1( LPVOID pParam ){
while(1){
EnterCriticalSection( &cs );//进入临界资源
printf( "Long long long-------------------\n" );
Sleep( 500 );
LeaveCriticalSection( &cs );//离开临界资源
}
return 0;
}//线程二
DWORD WINAPI TestProc2( LPVOID pParam ){
while(1){
EnterCriticalSection( &cs );
printf( "-------------------Long long long\n" );
Sleep( 1000 );
LeaveCriticalSection( &cs );
}
return 0;
}
void Critical( ){
InitializeCriticalSection( &cs );//初始化临界资源
DWORD nID = 0;//创建线程标识HANDLE hThread[2] = { 0 };
hThread[0] = CreateThread( NULL, 0, TestProc1, NULL, 0, &nID );
hThread[1] = CreateThread( NULL, 0, TestProc2, NULL, 0, &nID );
WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );
CloseHandle( hThread[0] );
CloseHandle( hThread[1] );
DeleteCriticalSection( &cs );//释放临界资源
}int main(int argc, char* argv[])
{
Critical( );
return 0;
}
二 事件
1 相关问题
程序之间通信问题
2 事件的使用
2.1 创建事件
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
BOOL bManualReset, // 复位方式
BOOL bInitialState, // 初始状态
LPCTSTR lpName // 事件名称
);//创建成功,返回事件句柄。
2.2 等候事件
WaitForSingleObject
WaitForMultipleObjects
2.3 触发事件(事件由无信号到有信号状态)
BOOL SetEvent(
HANDLE hEvent // 事件的句柄
);
2.4 将事件置为无信号状态
BOOL ResetEvent(
HANDLE hEvent //事件的句柄
);
2.5 关闭事件
CloseHandle
例子:
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
HANDLE hEvent = 0;
DWORD WINAPI TestProc1( LPVOID pParam ){
while(1){
WaitForSingleObject( hEvent, INFINITE );
// ResetEvent( hEvent );
printf( "Hello World\n" );
}
return 0;
}
DWORD WINAPI TestProc2( LPVOID pParam ){
while(1){
Sleep( 1000 );
printf( "love love\n");
SetEvent( hEvent );
}
return 0;
}void Event( ){
hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
DWORD nId = 0;
HANDLE hThread[2] = { 0 };
hThread[0] = CreateThread( NULL, 0, TestProc1, NULL, 0, &nId );
hThread[1] = CreateThread( NULL, 0, TestProc2, NULL, 0, &nId );
WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );
CloseHandle( hThread[0] );
CloseHandle( hThread[1] );
CloseHandle( hEvent );
}int main(int argc, char* argv[])
{
Event( );
return 0;
}
三 互斥 Mutex
1 相关问题
多线程下代码或资源共享

4636

被折叠的 条评论
为什么被折叠?



