另外,题目要求不使用sleep类函数。
解决方案 »
- MCI做播放器的小问题
- 怎样象操作系统一样,浏览的时候获取到文件的缩略图?
- 对话框上带buddy的Edit,变量设为long型,按动buddy的按钮后Edit中的数字为什么多出个豆号,怎样使edit里不出豆号,edit的属性number我已设为true了!
- 传送多个文件的问题!
- Atl COm wizard加入对话框处理问题,已困扰多日
- 怎么让一个对话框在主框架里显示
- 请教,如果想自己实现可装卸协议,能不能给个思路
- 请教这个函数的作用
- 动态显示图片程序报错
- 如何在appwizard创建的mdi程序里面实现“新建文档”的功能?
- 为什么我定义了def文件,DLL里的函数还是被改名呢
- MFC在界面上显示一张图片
两个线程交替输出用关键段就可以搞定,没必要用信号量。
关键段用法介绍:http://blog.csdn.net/morewindows/article/details/7442639
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>const int THREAD_COUNT = 2;
HANDLE g_hEvent1, g_hEvent2;
int g_i;
int g_count;unsigned int __stdcall ThreadFun1(void *pPM)
{
while (true)
{
WaitForSingleObject(g_hEvent1, INFINITE);
if (g_i < g_count)
printf("线程1输出%d\n", g_i++);
SetEvent(g_hEvent2);
if (g_i >= g_count)
break;
} //A thread created with _beginthreadex is terminated by a call to _endthreadex. //MSDN
_endthreadex(0);
return 0;
}unsigned int __stdcall ThreadFun2(void *pPM)
{
while (true)
{
WaitForSingleObject(g_hEvent2, INFINITE);
if (g_i < g_count)
printf("线程2输出%d\n", g_i++);
SetEvent(g_hEvent1);
if (g_i >= g_count)
break;
} //A thread created with _beginthreadex is terminated by a call to _endthreadex. //MSDN
_endthreadex(0);
return 0;
}int main()
{
printf(" 经典线程同步 事件Event 两个线程交替输出\n");
printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n"); HANDLE hThread[THREAD_COUNT];
//创建二个事件,初始时,一个已触发,一个未触发。
g_hEvent1 = CreateEvent(NULL, FALSE, TRUE, NULL);
g_hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL); g_count = 10; hThread[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun1, NULL, 0, NULL);
hThread[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun2, NULL, 0, NULL); WaitForMultipleObjects(THREAD_COUNT, hThread, TRUE, INFINITE); int i;
for (i = 0; i < THREAD_COUNT; i++)
CloseHandle(hThread[i]);
CloseHandle(g_hEvent1);
CloseHandle(g_hEvent2);
return 0;
}
事件可以见:http://blog.csdn.net/morewindows/article/details/7445233
用什么事件?看了作者的题目要求用信号量,那么CreateSemaphores里指定最大拥有者的数目为1,最小为1.用这个信号量来保证对全局变量n进行修改。每次增加1, 因为每个线程需要打印之。另外:printf函数似乎是线程安全的,似乎不需要对其保护。信号量的作用仅仅是保护全局变量。
如何退出线程?当n增加到规定的 N的时候,就setevent,然后return.另一个线程检测到event有信号,那么立即return.我这个思路,应该没错吧 ?