#include <windows.h>
#include <iostream>
using namespace std ;
DWORD WINAPI ThreadProc1(
  LPVOID lpParameter   // thread data
);
DWORD WINAPI ThreadProc2(
  LPVOID lpParameter   // thread data
);
int index = 0 ;
int tikets = 100 ;
int main ()
{
HANDLE hThread1 ;
HANDLE hThread2 ;
hThread1 = CreateThread (NULL, 0, ThreadProc1, NULL, 0, NULL) ;
hThread2 = CreateThread (NULL, 0, ThreadProc2, NULL, 0, NULL) ;
CloseHandle (hThread1) ;
CloseHandle (hThread2) ;
Sleep (2000) ;
//while (index ++ < 100)
//cout << "main Thread is running =====================" << endl ;
return 0 ;
}
DWORD WINAPI ThreadProc1(
  LPVOID lpParameter   // thread data
)
{
while (TRUE)
{
if (tikets > 0)
cout << "ThreadProc1 sell tiket: " << tikets -- << endl ;
else
break ;
}
return 0 ;

}
 DWORD WINAPI ThreadProc2(
  LPVOID lpParameter   // thread data
)
 {
 while (TRUE)
 {
if (tikets > 0)
cout << "ThreadProc2 sell tiket: " << tikets -- << endl ;
else 
break ;
 }
return 0 ;
 
 }
什么输出很混乱:
ThreadProc1 sellThreadProc2 sell tiket: 100
Thread tiket: 99
ThreadPProc1 sell tiket: roc2 sell tiket: 998
ThreadProc1 sel7
ThreadProc2 selll tiket: 96
Thread tiket: 95
ThreadPProc1 sell tiket: roc2 sell tiket: 994
.................
正确的输出应该是一行输出一句啊,怎么我这里是这样啊,我用vc跟dev都出现混乱的现象.求高手帮我解决

解决方案 »

  1.   

    线程都没有进行同步,当然混乱了:
    简单的办法,临界区
    #include <windows.h>
    #include <iostream>
    using namespace std ;
    DWORD WINAPI ThreadProc1(
      LPVOID lpParameter   // thread data
    );
    DWORD WINAPI ThreadProc2(
      LPVOID lpParameter   // thread data
    );
    int index = 0 ;
    int tikets = 100 ;
    CRITICAL_SECTION cs;
    int main ()
    {
    InitializeCriticalSection(&cs);
    HANDLE hThread1 ;
    HANDLE hThread2 ;
    hThread1 = CreateThread (NULL, 0, ThreadProc1, NULL, 0, NULL) ;
    hThread2 = CreateThread (NULL, 0, ThreadProc2, NULL, 0, NULL) ;
    CloseHandle (hThread1) ;
    CloseHandle (hThread2) ;
    Sleep (2000) ;
    DeleteCriticalSection(&cs);
    //while (index ++ < 100)
    //cout << "main Thread is running =====================" << endl ;
    return 0 ;
    }
     
    DWORD WINAPI ThreadProc1(
      LPVOID lpParameter   // thread data
    )
    {
    while (TRUE)
    {
    EnterCriticalSection(&cs);
    if (tikets > 0)
    cout << "ThreadProc1 sell tiket: " << tikets -- << '\n' ;
    else
    break ;
    LeaveCriticalSection(&cs);
    }
    return 0 ;

    }
     DWORD WINAPI ThreadProc2(
      LPVOID lpParameter   // thread data
    )
     {
     while (TRUE)
     {
     EnterCriticalSection(&cs);
    if (tikets > 0)
    cout << "ThreadProc2 sell tiket: " << tikets -- << '\n' ;
    else 
    break ;
    LeaveCriticalSection(&cs);
     }
    return 0 ;
     
     }
      

  2.   

    根据你的代码,你的输出是正常的,那个什么老师的可能特例,或者他为了美观起见稍微修改了下,线程跑起来以后,如果同时都要使用同一个resource,比如上面例子里的标准输出设备(由cout调用),之前先得进行同步。