事件 —event
1.通知类型
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, //SD
BOOL bManualReset, //TRUE 手工重置信号 / FALSE system自动重置信号
BOOL bInitialState, //初始状态
LPCTSTR lpName //object name 希望别的进程用
)
bManualReset
是否需要手工重置信号
If this parameter is TRUE, the function creates a manual-reset event object, which requires the use of the ResetEvent function to set the event state to nonsignaled. If this parameter is FALSE, the function creates an auto-reset event object, and system automatically resets the event state to nonsignaled after a single waiting thread has been released.
#include "stdafx.h"
#include <windows.h>
//安全描述符, 手工重置开关,初始状态 TURE/FALSE
//TURE 信号
HANDLE g_event = CreateEvent(NULL,TRUE,FALSE,NULL); //只要有状态就会去通知
DWORD WINAPI ThreadProc1(LPVOID lpParameter){
//当事件变成通知
TCHAR szBuffer[10] = {
0};
WaitForSingleObject(g_event,INFINITE); //等待单独对象 无限等待
Sleep(2000);
printf("线程1执行了!\n");
getchar();
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter){
//当事件变成通知
TCHAR szBuffer[10] = {
0};
WaitForSingleObject(g_event,INFINITE);
Sleep(2000);
printf("线程2执行了!\n");
getchar();
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
//创建通知类型
HANDLE ArrThread[2];
//创建俩个线程
ArrThread[0] = CreateThread(
NULL,
0,
ThreadProc1,
NULL,
0,
0);
ArrThread[1] = CreateThread(
NULL,
0,
ThreadProc2,
NULL,
0,
0);
//设置通知类型的信号
printf("回车设置事件信号\n");
getchar();
SetEvent(g_event);
//等待线程全部结束
WaitForMultipleObjects(2,ArrThread,TRUE,INFINITE);
CloseHandle(ArrThread[0]);
CloseHandle(ArrThread[1]);
CloseHandle(g_event);
return 0;
}
2.线程同步
- 线程互斥:线程互斥是指对于共享的进程系统资源,在各个单线程访问时的排它性。当有若干线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其他要使用的线程都必须等待,直到占用资源者释放该内存。
- 线程同步:线程同步是指多个线程之间具有一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
同步的前提是 互斥
同步 = 互斥 + 有序
添加 条件 实现线程同步
消费者 和 生产者 问题
只是实现线程互斥 而没有实现线程同步
// 条件判断线程同步.cpp