为什么能得到 g_number1 = 1000001, g_number2 = 1000002,g_number2 的值不应该比g_number1 的值大。
// processTest.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include <Windows.h>using namespace std;DWORD WINAPI ThreadProc(LPVOID lpParameter);CRITICAL_SECTION critical_section;int g_number1;
int g_number2;int _tmain(int argc, _TCHAR* argv[])
{
::InitializeCriticalSection(&critical_section); const int ThreadNumber = 5; HANDLE hthreads[ThreadNumber];
for (int i = 0; i < ThreadNumber;i++)
{
hthreads[i] = ::CreateThread(NULL,0 ,&ThreadProc,NULL,0,NULL);
}
::Sleep(0);//change to another thread ::WaitForMultipleObjects(ThreadNumber,hthreads,false,INFINITE); for (int i = 0; i < ThreadNumber;i++)
{
::CloseHandle(hthreads[i]);
} ::DeleteCriticalSection(&critical_section); cout<<"g_number1 = "<<g_number1<<endl;
cout<<"g_number2 = "<<g_number2<<endl; return 0;
}DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
while(g_number1 < 1000000)
{
::EnterCriticalSection(&critical_section);
Sleep(0);
g_number1++;
g_number2++;
::LeaveCriticalSection(&critical_section);
}
return 0;
}
// processTest.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include <Windows.h>using namespace std;DWORD WINAPI ThreadProc(LPVOID lpParameter);CRITICAL_SECTION critical_section;int g_number1;
int g_number2;int _tmain(int argc, _TCHAR* argv[])
{
::InitializeCriticalSection(&critical_section); const int ThreadNumber = 5; HANDLE hthreads[ThreadNumber];
for (int i = 0; i < ThreadNumber;i++)
{
hthreads[i] = ::CreateThread(NULL,0 ,&ThreadProc,NULL,0,NULL);
}
::Sleep(0);//change to another thread ::WaitForMultipleObjects(ThreadNumber,hthreads,false,INFINITE); for (int i = 0; i < ThreadNumber;i++)
{
::CloseHandle(hthreads[i]);
} ::DeleteCriticalSection(&critical_section); cout<<"g_number1 = "<<g_number1<<endl;
cout<<"g_number2 = "<<g_number2<<endl; return 0;
}DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
while(g_number1 < 1000000)
{
::EnterCriticalSection(&critical_section);
Sleep(0);
g_number1++;
g_number2++;
::LeaveCriticalSection(&critical_section);
}
return 0;
}
解决方案 »
- toolbar背景设置
- 急急急急急急急!
- new的内存块,用指针指向它,为何同一个指针为何不能释放两次呢? 我不明白道理,为何不能 delete 多次呢?已经释放了,再释放一次有何不好呢?
- 编译错误问题!
- VC中用ODBC连接数据库的问题
- 大哥们!!直接给一个能操纵网页里面按钮的例子吧!!(模拟单击按钮)越简单越好啊,我模拟按键快疯了
- 怎样使我的LISTVIEW中的LISTCTRL的头部在排序后显示出"向上"或"向下"的三角或自定义图标以标示是升序或降序呢?
- 怎样解决vc中不识文件路径f:\bmp\a.bmp中的字符'\'
- 100分相曾,请问那里可以下载vss的安装程序?
- ADO如何实现日期查询?
- 无法判断ftp上文件是文件夹还是文件
- 【求助】关于TCP协议的服务器和客户端连接问题
在声明前加上volatilevolatile int g_number1;
volatile int g_number2;
是不是也应该在临界区内
{
::EnterCriticalSection(&critical_section);
Sleep(0);
if(g_number1 < 1000000)
{
g_number1++;
g_number2++;
}
::LeaveCriticalSection(&critical_section);
}
嗯。看来是不行,问题出在while判断中可以这么写while(true)
{
::EnterCriticalSection(&critical_section);
Sleep(0);
if(g_number1 < 1000000)
{
g_number1++;
g_number2++;
}
else
break;
::LeaveCriticalSection(&critical_section);
}
}
::WaitForMultipleObjects(ThreadNumber,hthreads,false,INFINITE);
这句写错了。将false改成true再试试。
线程1 g_number1++;
主线程 cout<<g_number1;
线程1 g_number2++
线程2 g_number1++;
线程2 g_number2++;
主线程 cout<<g_number2;这种执行顺序取决于cpu的给线程分配的执行时间片,会有不确定性的
Sleep(0);
把Sleep(0);去掉试试
::WaitForMultipleObjects(ThreadNumber,hthreads,false,INFINITE);
因此只要有一个子线程执行完,主线程就会输出g_number1和g_number2。这样其他线程就有修改g_number1和g_number2的机会。因此主线程输出现g_number2比g_number1大时很正常的。