C++-windows临界区问题

发布于 2017-01-03 06:13:01 字数 1613 浏览 1422 评论 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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(1

瑾兮 2017-06-13 07:59:04

对于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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文