简单的多线程问题,程序有时能通过运行,有时通不过,请高手们支招。

C++语言 码拜 10年前 (2015-05-11) 834次浏览 0个评论

#include <stdio.h>
#include <windows.h>
#include <process.h>
#include<iostream>
using namespace std;

BOOL g_bContinue = TRUE;

CRITICAL_SECTION g_cs; // 对存在同步问题的代码段使用临界区对象

UINT __stdcall ThreadFunc1(LPVOID paccept)  ;
UINT __stdcall ThreadFunc2(LPVOID paccept);

 void main()
 {
UINT uId;
HANDLE h[2];
int a[2]={0,1};
h[0]=  (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc1, &a[0], 0, &uId);
h[1]=  (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc2, &a[1], 0, &uId);

// 初始化临界区对象
::InitializeCriticalSection(&g_cs);

// 等待1秒后通知两个计数线程结束,关闭句柄
Sleep(1000);
g_bContinue = FALSE;
::WaitForMultipleObjects(2, h, TRUE, INFINITE);

::CloseHandle(h[0]);
::CloseHandle(h[1]);

// 删除临界区对象
::DeleteCriticalSection(&g_cs);
 }
 UINT __stdcall ThreadFunc1(LPVOID paccept)
{
int a;
a= (int)   *((int*)paccept)  ;
while(g_bContinue)
{
::EnterCriticalSection(&g_cs);
cout<<a<<” “;
::LeaveCriticalSection(&g_cs);
for(int i=0;i<1000;i++)
;
}
return 0;
}

  UINT __stdcall ThreadFunc2(LPVOID paccept)
{
int a;
a= (int)   *((int*)paccept)  ;
while(g_bContinue)
{
::EnterCriticalSection(&g_cs);
cout<<a<<” “;
::LeaveCriticalSection(&g_cs);
for(int i=0;i<1000;i++)
;
}
return 0;
}

20分
开启线程前就得初始化关键区对象

void main()
{
	// 初始化临界区对象
	::InitializeCriticalSection(&g_cs);

	UINT uId;
	HANDLE h[2];
	int a[2] = { 0,1 };
	h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc1, &a[0], 0, &uId);
	h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc2, &a[1], 0, &uId);

	// 等待1秒后通知两个计数线程结束,关闭句柄
	Sleep(1000);
	g_bContinue = FALSE;
	::WaitForMultipleObjects(2, h, TRUE, INFINITE);

	::CloseHandle(h[0]);
	::CloseHandle(h[1]);

	// 删除临界区对象
	::DeleteCriticalSection(&g_cs);
}
这个是错误提示的结果:

简单的多线程问题,程序有时能通过运行,有时通不过,请高手们支招。

非常感谢zhangxiangDavaid ,问题立马解决,果然大神。
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明简单的多线程问题,程序有时能通过运行,有时通不过,请高手们支招。
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!