C++的成员函数在多线程下运行的测试
2014-02-10 21:07
309 查看
测试一多线程调用同一个类的成员函数
VC6下新建一基于对话框的工程,在类A中添加成员函数
之后在类A的CPP文件的成员函数外部定义线程函数
新添加一个对话框类B,类B中CPP的线程函数实现为
其中,线程1和线程2都是调用的类A的成员函数。
之后在类A中添加类B的成员变量
在类A的OnInitDialog函数中,用类A的成员变量指针创建类B,从而激发类B的OnInitDialog函数,这样类B的线程函数就可以执行类A的成员函数了。
之后点击运行,在类A的对话框中点击按钮,这样子,两个线程同时调用类A的成员函数了,可以看到,程序运行正常,没有出现错误。
测试二多线程访问同一CString全局变量,一个线程只读,一个线程只写,看一下会有什么反应!
在上述基础上,做一下修改。
首先,在类A的CPP中添加一个全局变量并赋予初始值
之后把线程1的线程函数修改为
,该线程函数用来读取全局变量CString的值。
把线程2的函数修改为
该线程负责不停的给全局变量写入值。
之后运行程序,按下按钮。
经过测试发现,
1 只开一个线程,无论是读还是写,程序都没有问题
2 假如同时打开两个线程,一个读,一个写,则程序出现错误,提示为:
“User breakpoint called from code at ****”。
在Release版本下也会出错,错误为“***指令引用的“***”内存,该内存不能为“read””。
3 假如两个线程同时写,程序没有问题。
4假如两个程序同时读,程序也没有问题。
在上述2条件下,用临界区进行线程同步,程序正常运行。
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条件下,用临界区进行线程同步,程序正常运行。
相关文章推荐
- C++类的静态成员函数在多线程的工作机制以及运行过程中强制结束线程实验
- C++程序运行时内存布局之----------简单类实例,成员变量,成员函数,静态成员变量,静态成员函数
- C++第三周任务3请在原类基础上,增加成员函数,要求前三个设计成内置函数,在main()数中增加适当的调用以展示扩充类定义后的功能(最好能一次运行)。
- C++::如何测试一个函数的运行时间
- 小字典之MFC简单的多线程调用类的成员函数实现逐步画线功能 VS2015 C++ 完成
- linux下c++多线程下用CLOCK()函数统计程序运行时间 2012-12-11 12:46:01 分类: C/C++ clock()函数的功能: 这个函数返回从“开启这个程序进程”到
- 测试一个函数的运行时间(C++)
- C++程序运行时内存布局之----------简单类实例,成员变量,成员函数,静态成员变量,静态成员函数
- C++程序运行时内存布局之----------简单类实例,成员变量,成员函数,静态成员变量,静态成员函数
- 【总结】C++静态成员函数及测试用例
- C和C++中函数运行时间测试
- C++程序运行时内存布局之----------简单类实例,成员变量,成员函数,静态成员变量,静态成员函数
- 【总结】C++静态成员函数及测试用例
- C++中类成员函数作为多线程的入口
- C++12.6 static 数据成员、static成员函数
- C++中的const成员函数和mutable关键字
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- c++ 运算符重载之成员函数重载
- C++静态成员函数小结(转)
- MATLAB中测试程序运行时间的函数