我写了个用事件同步多线程的程序,代码如下
#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望高手赐教~不胜感激~~~~~~
#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望高手赐教~不胜感激~~~~~~
解决方案 »
- 是去是留,用去整夜时间来思考这个问题.
- 关于界面控件的使用问题
- send时遇到WSAEWOULDBLOCK时该怎么处理?
- 问个关于APIHook的问题
- 请问各位大哥,如何在程序中实现测试sql 语句的功能,如同sql server 中的查询分析器中的ctr+f5的功能一样
- 有关VC++中弹出消息对话框时声音不一样的问题
- fopen()在这两种情况下结果为何不同?
- 急求助:在Visual C++的文本框里面输入一个函数,怎样将这个函数读出来,并可以把函数里面的变量赋值进行计算。
- richedit 自己实现了一个Ole显示gif图片,拖放后,变成空白,据说重载这两个接口可以正常,但是没有效果,求解???????
- MFC对话框控件上位图更新问题
- CEdit 点击后得到点处的字符(暂定5个)
- WebBrowser控件如何扩展js脚本
应放到CreateThread前面
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函数之前,两个线程是没有同步的运行的。
能帮忙运行下看看具体哪里的问题么?我的运行环境是win7下VC6.0
就可以理解为 在单核上 的程序 一样 就行了;