您的位置:首页 > 编程语言 > C语言/C++

C++的成员函数在多线程下运行的测试

2014-02-10 21:07 309 查看
测试一多线程调用同一个类的成员函数

VC6下新建一基于对话框的工程,在类A中添加成员函数

CString CCTestMutiThreadFuncDlg::AddStr(CString aStr, CString bStr)
{
return aStr+bStr;
}


之后在类A的CPP文件的成员函数外部定义线程函数
UINT Func1( LPVOID param )
{
while(1)
{
CString a,b,c;
a="123";
b="456";
c = CCTestMutiThreadFuncDlg::AddStr(a,b);
}
return 0 ;
}
在类A中按钮的响应函数中开启线程1

void CCTestMutiThreadFuncDlg::OnButton1()
{
// TODO: Add your control notification handler code here
AfxBeginThread(Func1,this);
}


新添加一个对话框类B,类B中CPP的线程函数实现为

UINT Func2( LPVOID param )
{
while(1)
{
CString a,b,c;
a="7";
b="8";
c = CCTestMutiThreadFuncDlg::AddStr(a,b);
}
return 0 ;
}
在类B的初始化函数中开启线程2

BOOL CDlg2::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
AfxBeginThread(Func2,this);
return TRUE;  // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}


其中,线程1和线程2都是调用的类A的成员函数。

之后在类A中添加类B的成员变量

CDlg2* pDlg2;
类A的构造函数中初始化该指针

pDlg2 = NULL;


在类A的OnInitDialog函数中,用类A的成员变量指针创建类B,从而激发类B的OnInitDialog函数,这样类B的线程函数就可以执行类A的成员函数了。

pDlg2 = new CDlg2;
pDlg2->Create(IDD_DIALOG1,this);


之后点击运行,在类A的对话框中点击按钮,这样子,两个线程同时调用类A的成员函数了,可以看到,程序运行正常,没有出现错误。

测试二多线程访问同一CString全局变量,一个线程只读,一个线程只写,看一下会有什么反应!

在上述基础上,做一下修改。

首先,在类A的CPP中添加一个全局变量并赋予初始值

CString g_str("init");


之后把线程1的线程函数修改为

UINT Func1( LPVOID param )
{
while(1)
{
// 		CString a,b,c;
// 		a="123";
// 		b="456";
// 		c = CCTestMutiThreadFuncDlg::AddStr(a,b);
CString c;
c = g_str;
}
return 0 ;
}


,该线程函数用来读取全局变量CString的值。

把线程2的函数修改为

UINT Func2( LPVOID param )
{
while(1)
{
// 		CString a,b,c;
// 		a="7";
// 		b="8";
// 		c = CCTestMutiThreadFuncDlg::AddStr(a,b);
g_str = "abc";
}
return 0 ;
}


该线程负责不停的给全局变量写入值。

之后运行程序,按下按钮。

经过测试发现,

1 只开一个线程,无论是读还是写,程序都没有问题

2 假如同时打开两个线程,一个读,一个写,则程序出现错误,提示为:

“User breakpoint called from code at ****”。

在Release版本下也会出错,错误为“***指令引用的“***”内存,该内存不能为“read””。

3 假如两个线程同时写,程序没有问题。

4假如两个程序同时读,程序也没有问题。

在上述2条件下,用临界区进行线程同步,程序正常运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐