#include <windows.h>
#include <iostream.h>
DWORD WINAPI Funproc1(LPVOID lparameter);
DWORD WINAPI Funproc2(LPVOID LParameter);
int tickets=1000;
CRITICAL_SECTION g_cs;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Funproc1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Funproc2,NULL,0,NULL);
InitializeCriticalSection(&g_cs);
Sleep(5000);
DeleteCriticalSection(&g_cs);
}
DWORD WINAPI Funproc1(LPVOID lparameter)
{
while (true)
{
         EnterCriticalSection(&g_cs);
 Sleep(10);
 if(tickets>0)
 {
 cout<<"thread1 sell tickets:"<<tickets--<<endl;
 LeaveCriticalSection(&g_cs);  }
 else
 {
             LeaveCriticalSection(&g_cs);
 break;
 }
 
}
return 0;
}
DWORD WINAPI Funproc2(LPVOID lparameter)
{
while (true) 
{
EnterCriticalSection(&g_cs);
Sleep(10);
       if( tickets>0)
{
cout<<"thread2 sell tickets:"<<tickets--<<endl;
LeaveCriticalSection(&g_cs);
}
else
{
LeaveCriticalSection(&g_cs);
break;
}
}
return 0;
}
功能是两个线程实现同步卖出1000张ticksts;
问题:
sleep()的参数不同 卖出的票的张数不就不同 可以试试 程序能运行 小弟刚刚学 不知道是咋回事 望大家指导指导 谢谢ing

解决方案 »

  1.   

    Sleep的时候,当前线程就让出CPU了,如果不同,可能另一个线程就会多次执行,一直占用CPU,结果就不同了
      

  2.   

    已经是第N次见到这类问题了,InitializeCriticalSection要在CreateThread之前执行才行。
      

  3.   

    你主线程中不用Sleep来等待,可以用WaitForSingleObject等一直等待,直到线程卖了你规定的票数,然后SetEvent来让主线程退出等待...
      

  4.   

    如果你想等到票都卖完后立即结束程序,就在主线程中检查票剩余的数量,或者等待线程结束,或者干脆用ExitThread退出主线程。
      

  5.   

    main函数这么改一下:
    void main() 

            //thread handle array
    HANDLE hThread[2]; 

    InitializeCriticalSection(&g_cs);  hThread[0]=CreateThread(NULL,0,Funproc1,NULL,0,NULL); 
    hThread[1]=CreateThread(NULL,0,Funproc2,NULL,0,NULL); 

    //等待2个线程都结束。
    WaitForMultipleObjects(2, hThread, TRUE, -1); DeleteCriticalSection(&g_cs); 

      

  6.   

    #include <windows.h>
    #include <iostream.h>
    DWORD WINAPI Funproc1(LPVOID lparameter);
    DWORD WINAPI Funproc2(LPVOID LParameter);
    int tickets=1000;
    CRITICAL_SECTION g_cs;
    void main()
    {
    InitializeCriticalSection(&g_cs);
    HANDLE hThread[2];
        hThread[0]=CreateThread(NULL,0,Funproc1,NULL,0,NULL);
    hThread[1]=CreateThread(NULL,0,Funproc2,NULL,0,NULL);
    Sleep(6000);
       WaitForMultipleObjects(2,hThread, TRUE, -1);
    //if(tickets>0)
    // Sleep(4000);
    DeleteCriticalSection(&g_cs);
    }
    DWORD WINAPI Funproc1(LPVOID lparameter)
    {
    while (true)
    {
             EnterCriticalSection(&g_cs);
     Sleep(5);
     if(tickets>0)
     {
     Sleep(5);
     cout<<"thread1 sell tickets:"<<tickets--<<endl;
     LeaveCriticalSection(&g_cs);  }
     else
     {
                 LeaveCriticalSection(&g_cs);
     break;
     }
     
    }
    return 0;
    }
    DWORD WINAPI Funproc2(LPVOID lparameter)
    {
    while (true) 
    {
    EnterCriticalSection(&g_cs);
    Sleep(5);
           if( tickets>0)
    {
       Sleep(5); cout<<"thread2 sell tickets:"<<tickets--<<endl;
    LeaveCriticalSection(&g_cs);
    }
    else
    {
    LeaveCriticalSection(&g_cs);
    break;
    }
    }
    return 0;
    }
    谢谢你
      

  7.   

    #include <windows.h>
    #include <iostream.h>
    DWORD WINAPI Funproc1(LPVOID lparameter);
    DWORD WINAPI Funproc2(LPVOID LParameter);
    int tickets=1000;
    CRITICAL_SECTION g_cs;
    void main()
    {
    InitializeCriticalSection(&g_cs);
    HANDLE hThread[2];
        hThread[0]=CreateThread(NULL,0,Funproc1,NULL,0,NULL);
    hThread[1]=CreateThread(NULL,0,Funproc2,NULL,0,NULL);
    Sleep(6000);
       WaitForMultipleObjects(2,hThread, TRUE, -1);
    //if(tickets>0)
    // Sleep(4000);
    DeleteCriticalSection(&g_cs);
    }
    DWORD WINAPI Funproc1(LPVOID lparameter)
    {
    while (true)
    {
             EnterCriticalSection(&g_cs);
     Sleep(5);
     if(tickets>0)
     {
     Sleep(5);
     cout<<"thread1 sell tickets:"<<tickets--<<endl;
     LeaveCriticalSection(&g_cs);  }
     else
     {
                 LeaveCriticalSection(&g_cs);
     break;
     }
     
    }
    return 0;
    }
    DWORD WINAPI Funproc2(LPVOID lparameter)
    {
    while (true) 
    {
    EnterCriticalSection(&g_cs);
    Sleep(5);
           if( tickets>0)
    {
       Sleep(5); cout<<"thread2 sell tickets:"<<tickets--<<endl;
    LeaveCriticalSection(&g_cs);
    }
    else
    {
    LeaveCriticalSection(&g_cs);
    break;
    }
    }
    return 0;
    }
    谢谢你
      

  8.   

    代码没问题。怎么卖不完?最后显示多少?
    另外,用WaitForMultipleObjects等待线程结束就不用Sleep了。
      

  9.   

    sleep()的参数不同 最后和开始的数就不同 我统计一下 299是开始出现多的一次  还有最大只能卖300多张票
      

  10.   

    主函数中 不用sleep() 结果没有什么变化
    你在你机器上试试 我感觉很奇怪 是不是机器的问题呢 
    谢谢ing
      

  11.   

    这是正常的,没有什么要解决的,你在程序中Sleep一下,就可以看到是从1000开始逐渐减少的了。
      

  12.   

    弄明白了 谢谢你 
    这个问题上学期我就一直在思考 问老师也说不出个所以然 哎 现在的大学啊 
    还是csdn 好
    谢谢你了 以后要是有问题就找你了啊 呵呵