另外,题目要求不使用sleep类函数。

解决方案 »

  1.   

    贴下题目要求吧。
    两个线程交替输出用关键段就可以搞定,没必要用信号量。
    关键段用法介绍:http://blog.csdn.net/morewindows/article/details/7442639
      

  2.   

    用事件来模拟下两个线程交替输出,你看看:
    #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;
    }
      

  3.   

    这里说错了,应该用事件来保证两个线程的同步。
    事件可以见:http://blog.csdn.net/morewindows/article/details/7445233
      

  4.   


    用什么事件?看了作者的题目要求用信号量,那么CreateSemaphores里指定最大拥有者的数目为1,最小为1.用这个信号量来保证对全局变量n进行修改。每次增加1, 因为每个线程需要打印之。另外:printf函数似乎是线程安全的,似乎不需要对其保护。信号量的作用仅仅是保护全局变量。
    如何退出线程?当n增加到规定的  N的时候,就setevent,然后return.另一个线程检测到event有信号,那么立即return.我这个思路,应该没错吧 ?