C++-windows临界区问题
这段代码在VC6.0中会出现内存错误,在vs2005中确没有问题,是什么原因
#include <iostream>
#include <Windows.h>
using namespace std;
int pp[6];
CRITICAL_SECTION g_cs;
DWORD WINAPI ThreadProc1(LPVOID /*lpParameter*/)
{
while(TRUE)
{
//EnterCriticalSection(&g_cs);
cout<<"ThreadProc1::";
for (int i = 0; i<6; ++i)
{
pp[i]++;
cout<<pp[i]<<" ";
}
cout<<endl;
//LeaveCriticalSection(&g_cs);
//Sleep(1);
}
}
void print_()
{
for (int i = 0; i<6; ++i)
{
cout<<pp[i]<<" ";
}
}
DWORD WINAPI ThreadProc2(LPVOID /*lpParameter*/)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
cout<<"ThreadProc2::";
//print_();
for (int i = 0; i<6; ++i)
{
cout<<pp[i]<<" ";
}
Sleep(2);
cout<<endl;
LeaveCriticalSection(&g_cs);
//Sleep(1);
}
}
void main()
{
for (int i = 0; i<6; ++i)
{
pp[i] = i+1;
}
InitializeCriticalSection(&g_cs);
HANDLE hThread[2];
hThread[0] = CreateThread(NULL, 0, ThreadProc1, NULL, 0, 0);
hThread[1] = CreateThread(NULL, 0, ThreadProc2, NULL, 0, 0);
WaitForMultipleObjects(2, hThread, TRUE ,INFINITE);
DeleteCriticalSection(&g_cs);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于cout的实现,VC6.0和vc2005是不同的。你取消掉ThreadProc1中EnterCriticalSection(&g_cs)和LeaveCriticalSection(&g_cs)的注释,那么行为应该就正确了。但实际上可能还存在问题,即不应该通过CreateThread直接在C/C++中创建线程,而是使用_beginthread/_beginthreadex
msdn文档:http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.71).aspx
参考:http://www.cppblog.com/eday/archive/2006/11/25/15648.html