标签:线程通信
//一个线程之间的通信 DWORD WINAPI firstthread(void *p) { MessageBoxA(0, "1", "1", 0); printf("第1个线程执行完成\n"); SetEvent(event[0]);//发出事件信号 return 0; } DWORD WINAPI secondthread(void *p) { WaitForSingleObject(event[0], INFINITE);//等待event信号出现,执行下一步 MessageBoxA(0, "2", "2", 0); printf("第2个线程执行完成\n"); return 0; } void main() { //SECURITY_ATTRIBUTES,指定一个结构,用于设置对象的安全特性。如变成ByVal As Long,并传递零值,则表明使用对象默认的安全设置 //Long,如果为TRUE,表示创建一个人工重设事件;如果为FALSE,表示创建一个自动重设事件 //Long,如事件应内部进入触发状态,则为TRUE //String,指定事件对象的名字。用vbNullString创建一个未命名事件对象。如已经存在拥有这个名字的一个事件, //则现有的命名事件就会打开。这个名字可能不与一个现有互斥体、信号机、可等待计时器或文件映射的名字相符 event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);//创建事件 event[1] = CreateEvent(NULL, TRUE, FALSE, NULL); hthread[0]=CreateThread(NULL, 0, firstthread, NULL, 0, NULL); hthread[1] = CreateThread(NULL, 0, secondthread, NULL, 0, NULL); WaitForMultipleObjects(2, hthread, TRUE, INFINITE); printf("线程任务完成\n"); system("pause"); }
////////////////////////////////////////////////////////////////////////// //两个线程之间的通信 DWORD WINAPI AAA(void *p) { int i = 1; printf("AAA第%d次:发出信号aaaaa......\n",i); SetEvent(event[0]);//此处作为第一次的发话者 否则会造成死锁 while (++i) { WaitForSingleObject(event[1], INFINITE); printf("AAA第%d次说:发出信号aaaaa......\n", i); SetEvent(event[0]); Sleep(1000); } } DWORD WINAPI BBB(void *p) { int i = 0; while (++i) { WaitForSingleObject(event[0], INFINITE); printf("BBB第%d次说:发出信号bbbbb......\n", i); SetEvent(event[1]); Sleep(1000); } } void main() { event[0] = CreateEvent(NULL, TRUE, FALSE, NULL); event[1] = CreateEvent(NULL, TRUE, FALSE, NULL); hthread[0] = CreateThread(NULL, 0, AAA, NULL, 0, NULL); hthread[1] = CreateThread(NULL, 0, BBB, NULL, 0, NULL); WaitForMultipleObjects(2, hthread, TRUE, INFINITE); system("pause"); }
HANDLE event[4] = { 0 };//事件 HANDLE hthread[3] = {0};//代表线程 CRITICAL_SECTION cs; char str[1024] = { 0 };//代表聊天内容的缓冲区 DWORD WINAPI zhouruifu(void *p) { int i = 0; int k = 0; while (++i) { printf("--------------------\n"); if (k==0) { printf("--------------------k=0\n"); WaitForSingleObject(event[0], INFINITE); EnterCriticalSection(&cs); printf("\n中介:%d %s",i, str); LeaveCriticalSection(&cs); Sleep(1000); SetEvent(event[1]);//发送给1 k = 1; } else { printf("--------------------k=1\n"); WaitForSingleObject(event[2], INFINITE);//等待2 EnterCriticalSection(&cs); printf("\n传递数据:%d %s",i, str); LeaveCriticalSection(&cs); Sleep(1000); SetEvent(event[3]);//发送给3 k = 0; } } } DWORD WINAPI hello(void *p) { int i =1; EnterCriticalSection(&cs); memset(str, '\0', 1024); sprintf(str, "\nhello第%d次说: i love you world", i); LeaveCriticalSection(&cs); Sleep(1000); SetEvent(event[0]); while (++i) { WaitForSingleObject(event[3], INFINITE); EnterCriticalSection(&cs); memset(str, '\0', 1024);//清空内容 sprintf(str, "\nhello第%d次说: i love you world", i); LeaveCriticalSection(&cs); Sleep(1000); SetEvent(event[0]); } return 0; } DWORD WINAPI world(void *p) { int i = 0; while (++i) { WaitForSingleObject(event[1], INFINITE); EnterCriticalSection(&cs); memset(str, '\0', 1024); sprintf(str,"\nworld第%d次说: i love you too", i); LeaveCriticalSection(&cs); Sleep(1000); SetEvent(event[2]); } return 0; } ////////////////////////////////////////////////////////////////////////// //三个线程之间的通信 中介者模式 void main() { InitializeCriticalSection(&cs);//初始化 event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);//创建事件 event[1] = CreateEvent(NULL, TRUE, FALSE, NULL); event[2] = CreateEvent(NULL, TRUE, FALSE, NULL); event[3] = CreateEvent(NULL, TRUE, FALSE, NULL); hthread[0] = CreateThread(NULL, 0, hello, NULL, 0, NULL); hthread[1] = CreateThread(NULL, 0, world, NULL, 0, NULL); hthread[2] = CreateThread(NULL, 0,zhouruifu, NULL, 0, NULL); WaitForMultipleObjects(2, hthread, TRUE, INFINITE); printf("over"); DeleteCriticalSection(&cs); system("pause"); }
版权声明:本文为博主原创文章,欢迎指出代码不良之处,及提出代码优化方案。欢迎指点,黑夜代码,拼命奋斗,努力更新中......
标签:线程通信
原文地址:http://blog.csdn.net/zhouruifu2015/article/details/47834259