我写了个用事件同步多线程的程序,代码如下
#include "iostream"
#include "windows.h"
using namespace std;int tickets = 100;
HANDLE hEvent;DWORD WINAPI threadProc1(LPVOID lpParameter) {
while(1) {
WaitForSingleObject(hEvent, INFINITE);
if(tickets > 0) {
Sleep(1);
cout << "thread1 sell ticket: " << tickets-- << endl;
}
else {
break;
}
SetEvent(hEvent);
}
return 0;
}DWORD WINAPI threadProc2(LPVOID lpParameter) {
while(1) {
WaitForSingleObject(hEvent, INFINITE);
if(tickets > 0) {
Sleep(1);
cout << "thread2 sell ticket: " << tickets-- << endl;
}
else {
break;
}
SetEvent(hEvent);
}
return 0;
}
void main() {
HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc1, NULL, 0, NULL);
HANDLE h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc2, NULL, 0, NULL);
CloseHandle(h1);
CloseHandle(h2); hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
SetEvent(hEvent); Sleep(4000);
CloseHandle(hEvent);
return;
}
但问题是,每次运行的结果具有不确定性,我怀疑是双核处理器造成的(我的CPU是Intel奔腾双核T4200)。
正常的情况是:
thread2 sell ticket: 30
thread1 sell ticket: 29
thread2 sell ticket: 28
thread1 sell ticket: 27
thread2 sell ticket: 26
thread1 sell ticket: 25
thread2 sell ticket: 24
thread1 sell ticket: 23
thread2 sell ticket: 22
thread1 sell ticket: 21
thread2 sell ticket: 20
thread1 sell ticket: 19
thread2 sell ticket: 18
thread1 sell ticket: 17
thread2 sell ticket: 16
thread1 sell ticket: 15
thread2 sell ticket: 14
thread1 sell ticket: 13
thread2 sell ticket: 12
thread1 sell ticket: 11
thread2 sell ticket: 10
thread1 sell ticket: 9
thread2 sell ticket: 8
thread1 sell ticket: 7
thread2 sell ticket: 6
thread1 sell ticket: 5
thread2 sell ticket: 4
thread1 sell ticket: 3
thread2 sell ticket: 2
thread1 sell ticket: 1
不正常的情况是:
1 thrseaed2 lselll t tiicckkeett::  2234tthhrreeaadd21  sseellll  ttiicckkeett::  2212tthhrreeaadd12  sseellll  ttiicckkeett::  210
9t
hrteharde1a ds2e lsle ltli ctkiectk:e t1:8
17t
hrthreeada2 sdell1 ti ckeset: 15
ll ticketth:r e1a6d
2 tsherlela dt1i cskeeltl:  t1i4c
ket: 13
tthhrreeaadd21  sseellll ti ctkiect:k 1e1t
: t1h2r
eatdh1r esaedl2l  steilclk etti:c k1e0t
: t9h
retad1 hsreelald 2t isceket: 8
ltlh rteiacdk1e tsel:l  7t
icthkreetad:2  6s
eltlh rteiacdk1e ts:el l5
tithrecad2k seeltl:  t4i
ckthread1 este:l l3
titchkreeta:d 22
sell ticket: 1望高手赐教~不胜感激~~~~~~

解决方案 »

  1.   

    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    应放到CreateThread前面
      

  2.   


    void main()    {
        HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc1, NULL, 0, NULL);
        HANDLE h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc2, NULL, 0, NULL);
        CloseHandle(h1);
        CloseHandle(h2);    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        SetEvent(hEvent);    Sleep(4000);
        CloseHandle(hEvent);
        return;
    }是不是应该改成这个样子,
    void main()    {
        hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        SetEvent(hEvent);
        HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc1, NULL, 0, NULL);
        HANDLE h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadProc2, NULL, 0, NULL);
        CloseHandle(h1);
        CloseHandle(h2);    Sleep(4000);
        CloseHandle(hEvent);
        return;
    }线程已经运行了,而事件还没有创建,WaitForSingleObject()函数就没有等待了,直接返回来。在CreateEvent函数之前,两个线程是没有同步的运行的。
      

  3.   


    能帮忙运行下看看具体哪里的问题么?我的运行环境是win7下VC6.0
      

  4.   

    双核 协作 处理 线程任务, 是 Windows  系统做的事, 和你程序员 没关系,  你只要 掌握 Windows  内核对象 的 特性,
     就可以理解为 在单核上 的程序 一样 就行了; 
      

  5.   

    这个说明运行时库的cout不是线程安全的,要对cout做同步应该就OK了
      

  6.   

    都不是~我解决了已经~~是因为还没做同步之前子线程就运行导致的~~~不过还是thx anyway~~XD