C++-windows临界区问题

C++-windows临界区问题

想挽留 发布于 2017-01-03 字数 1640 浏览 1255 回复 1

这段代码在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);
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瑾兮 2017-06-13 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