能力值:
( LV7,RANK:100 )
|
-
-
2 楼
自己顶一个!!!
大家都说说看法把
|
能力值:
(RANK:330 )
|
-
-
3 楼
我还是自信这段代码没有太大问题的。
g_tickets--
加个临界
|
能力值:
( LV7,RANK:100 )
|
-
-
4 楼
[QUOTE=Bughoho;418528]我还是自信这段代码没有太大问题的。
g_tickets--
加个临界[/QUOTE]
看样子我的XP确实性能不稳了
|
能力值:
(RANK:330 )
|
-
-
5 楼
看来你没明白我的意思 你的是代码问题 什么爱国版 恨国版 上海版 fuck god。
|
能力值:
( LV9,RANK:250 )
|
-
-
6 楼
我所使用的XP是爱国版的.
难道爱国版是重写了内核,注入了中国民族血液?
|
能力值:
( LV7,RANK:100 )
|
-
-
7 楼
我看有可能!!!
注:其实我以前用的是正版的,但是正版这事那事太多嫌麻烦。重装了
|
能力值:
( LV7,RANK:100 )
|
-
-
8 楼
我是使用事件对象同步的,和临界区同步没有什么区别啊
|
能力值:
( LV7,RANK:100 )
|
-
-
9 楼
昨天晚上想了一宿。。。
决定用其他人的机器测试一下。
发觉他们的结果没有错误——甚至包括寝室里面最慢最慢的笨驴子!
我还用我的电脑上的VMware测试了一下,也没有出错
所以感慨一下——我要重装系统了——我的系统真的有问题了,(我怀疑是驱动问题)
昨晚迅雷不停出错,可能也是线程同步问题,
(D版系统确实不太稳定,被我瞎整一通,问题大大)
欢迎大家也发表一下看法吧。
|
能力值:
(RANK:1010 )
|
-
-
10 楼
g_tickets作为全局变量在多线程中使用,
不能直接操作,需要用原子操作来访问
g_tickets--经过编译器后可能生成3个汇编指令
可以使用InterlockedExchangeAdd来实现原子访问操作
|
能力值:
( LV7,RANK:100 )
|
-
-
11 楼
各位的指教我先收下了。。
我得好好研究一下Event,CriticalSection,Semaphore,atomic addition,Mutext,的关系和区别
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
代码看上去是确实没什么问题。。。
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
很好奇
真的有这么多种版啊
不知可有好事者创见个仙人版版呢
呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
呵呵,仙人版?我们家乡就有种食品就叫做“仙人粄”的,广州这边都叫“凉粉”
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
据说微软推荐用 临界区
HOHO。。
|
能力值:
( LV3,RANK:30 )
|
-
-
16 楼
仁兄你说的很有趣啊
“仙人粄”不曾听过
“凉粉”这就知道也甲过
呵呵
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
#include <windows.h>
#include <iostream.h>
DWORD WINAPI myThreadProc1(LPVOID lpParameter);
DWORD WINAPI myThreadProc2(LPVOID lpParameter);
int g_tickets = 100;
HANDLE g_hEvent;
CRITICAL_SECTION cs;
void main()
{
InitializeCriticalSection(&cs);
//创建两个买票线程
HANDLE hThread1 = CreateThread(NULL,0,myThreadProc1,NULL,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,myThreadProc2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
//创建自动重置的事件对象
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
/*g_hEvent = CreateEvent(NULL,FALSE,FALSE,"tickets sale");
if(g_hEvent)
{
if(ERROR_ALREADY_EXISTS == GetLastError())
{
cout<<"Only one instance can run!"<<endl;
return;
}
}
*/
SetEvent(g_hEvent);//开始卖票
Sleep(4000);
CloseHandle(g_hEvent);
//DeleteCriticalSection(&cs);
system("pause");
}
DWORD WINAPI myThreadProc1(LPVOID lpParameter)
{
while(TRUE)
{
WaitForSingleObject(g_hEvent,INFINITE);
if(g_tickets>0)
{
EnterCriticalSection(&cs);
Sleep(1);
cout<<"Thread 1 selled ticket "<<g_tickets--<<endl;
LeaveCriticalSection(&cs);
}
else
{
SetEvent(g_hEvent);
break;
}
SetEvent(g_hEvent);
}
return 0;
}
DWORD WINAPI myThreadProc2(LPVOID lpParameter)
{
while(TRUE)
{
WaitForSingleObject(g_hEvent,INFINITE);
if(g_tickets>0)
{
EnterCriticalSection(&cs);
Sleep(1);
cout<<"Thread 2 selled ticket "<<g_tickets--<<endl;
LeaveCriticalSection(&cs);
}
else
{
SetEvent(g_hEvent);
break;
}
SetEvent(g_hEvent);
}
return 0;
}
|
|
|