- 互斥,解决线程冲突
- 事件,解决线程通信
- 临界区,解决线程冲突
- 时间,同步线程
有时线程之间的信号不同步或者乱序。这时需要信号复位。
event[0] = CreatEvent(NULL, TRUE, FALSE, NULL);
//第二个参数;TRUE代表手动复位 (就是用ResetEvent), FALSE代表自动进行信号复位
//第三个参数:信号的状态
//第四个参数:信号标记名称
ResetEvent(event[0]); //信号复位
信号你用完了之后,再次利用,这中间就会发生冲突问题,有的信号是自动复位的,但是多线程操作的时候,同时访问时,有时候会操作失败,所以需要我们主动去复位。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<Windows.h> //互斥解决线程冲突 //事件解决线程通信 //临界区解决线程冲突 //时间同步线程 HANDLE event[5] = { 0 }; HANDLE thread[5] = { 0 }; char str[256] = { 0 };//全局变量 DWORD WINAPI fupo(void *p) { int i = 0; int k = 0; while (++i) { if (k==0) { WaitForSingleObject(event[1], INFINITE);//无线等待一个信号 printf("媒婆读取%d次,%s\n", i, str); Sleep(1000); SetEvent(event[2]); k = 1; } else { WaitForSingleObject(event[3], INFINITE);//无线等待一个信号 printf("媒婆读取%d次,%s\n", i, str); Sleep(1000); SetEvent(event[0]); k = 0; } } } DWORD WINAPI haihua(void *p) { int i = 1; memset(str, ‘0‘, 256); sprintf(str, "海华%d次说: i love you fangfang ,please help me debug", i); //printf("\n海华%d次说: i love you fangfang ,please help me debug", i); Sleep(1000); SetEvent(event[1]); while (++i) { WaitForSingleObject(event[0], INFINITE);//无线等待一个信号 //printf("\n海华%d次说: i love you fangfang ,please help me debug", i); memset(str, ‘0‘, 256); sprintf(str, "海华%d次说: i love you fangfang ,please help me debug", i); Sleep(1000); //ResetEvent(event[0]);//信号复位 SetEvent(event[1]); } return 1; } DWORD WINAPI wangfang(void *p) { int i = 0; while (++i) { WaitForSingleObject(event[2], INFINITE);//无线等待一个信号 //printf("\nwangfang%d次说: sorry ,but i love you", i); memset(str, ‘0‘, 256); sprintf(str, "wangfang%d次说: sorry ,but i love you", i); Sleep(1000); //ResetEvent(event[1]); SetEvent(event[3]); } return 1; } void main() { //第二个参数代表,FALSE,自动,TRUE手动需要reset //第三个参数信号状态 //第四个参数标记名称 event[0] = CreateEventA(NULL, FALSE, FALSE, "hello"); event[1] = CreateEventA(NULL, FALSE, FALSE, NULL); event[2] = CreateEventA(NULL, FALSE, FALSE, "hello"); event[3] = CreateEventA(NULL, FALSE, FALSE, NULL); thread[0] = CreateThread(NULL, 0, haihua, NULL, 0, NULL); thread[1] = CreateThread(NULL, 0, wangfang, NULL, 0, NULL); thread[2] = CreateThread(NULL, 0, fupo, NULL, 0, NULL); WaitForMultipleObjects(3, thread, TRUE, INFINITE); system("pause"); }
时间: 2024-10-26 21:36:40