准确的说这是在别人代码上修改的,虽说这种实现方法可以实现题意。但是总感觉还有更好的方法,如果读者有更好的方法欢迎留言,如果读完本文有所收获也可以留言,大家一起分享。
#include <stdio.h>
#include <process.h>
#include <windows.h>
HANDLE g_hThreadEvent1;
HANDLE g_hThreadEvent2;
int g_nMainLoopNum = 0;
int g_nSubLoopNum = 0;
#define LOOPNUM 50
#define MAINLOOPNUM 100
#define SUBLOOPNUM 10
unsigned int __stdcall subThreadFun(void* pData)
{
while (1) //子线程要一直监听信号量?
{
WaitForSingleObject(g_hThreadEvent2, INFINITE); //等待事件2的信号量,期间不往下执行 P(event2)
g_nSubLoopNum++; //子线程执行次数
for (int i = 1; i <= SUBLOOPNUM; i++)
{
printf("子线程编号是 %d ,在循环第 %d 次\n", GetCurrentThreadId(), i);
}
printf("************子线程正在执行第%d次**************\n\n", g_nSubLoopNum);
ReleaseSemaphore(g_hThreadEvent1, 1, NULL); //设置事件1的信号量,相当于执行主线程 v(event1)
Sleep(100);
}
return 0;
}
int main()
{
g_hThreadEvent1 = CreateSemaphore(NULL, 0, 1, NULL);
g_hThreadEvent2 = CreateSemaphore(NULL, 1, 1, NULL);
_beginthreadex(NULL, 0, subThreadFun, NULL, 0, NULL); //创建子线程
//相当于main为主线程
for (int i = 1; i <= LOOPNUM; ++i)
{
WaitForSingleObject(g_hThreadEvent1, INFINITE); //一直等待线程事件1的信号量 p(event1)
g_nMainLoopNum++; //主线程执行次数
for (int num = 1; num <= MAINLOOPNUM; num++)
{
printf("主线程编号是 %d ,在循环第 %d 次\n", GetCurrentThreadId(), num );
}
printf("************主线程正在执行第%d次**************\n\n", g_nMainLoopNum);
Sleep(100);
if (i != LOOPNUM)
{
ReleaseSemaphore(g_hThreadEvent2, 1, NULL); //给事件2设置信号量,就是让子线程执行 v(event2)
}
else
break;
}
CloseHandle(g_hThreadEvent1);
CloseHandle(g_hThreadEvent2);
return 0;
}
原博客地址:http://blog.csdn.net/morewindows/article/details/7392749#cpp