更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
关于公众号的描述访问如下链接
//一个线程之间的通信
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");
}
更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
关于公众号的描述访问如下链接