所以我对一般的线程很新,并且在过去的几周里一直在尝试使用pthreads。我创建了一个在其自身内部具有线程功能的类。它工作正常,直到我尝试将类属性(整数)设置为值。
.h文件:
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include <iostream>
#include <windows.h>
using namespace std;
class testClass
{
public:
testClass();
HANDLE h;
static DWORD WINAPI mythread(LPVOID param);
int mytestint;
void printstuffs();
void startThread();
};
#endif // TESTCLASS_H
.cpp文件
#include "testClass.h"
testClass::testClass()
{
cout << "Created class" << endl;
}
DWORD WINAPI testClass::mythread(LPVOID param)
{
cout << "In thread" << endl;
testClass* This = (testClass*)param;
cout << "Calling class function" << endl;
This->printstuffs();
cout << "Thread is done" << endl;
return NULL;
}
void testClass::printstuffs()
{
cout << "In class function " << endl;
mytestint = 42; // <- crashes here
cout << "Test Int = " << mytestint << endl;
}
void testClass::startThread()
{
h = CreateThread(NULL, 0, mythread, (LPVOID)0, 0, NULL);
cout << "Thread started" << endl;
}
那么为什么我打电话给mytestint = 42;
时会崩溃?
答案 0 :(得分:2)
实现线程回调的方式不正确。并且你确定它在整数赋值时崩溃,我认为它必须在你的线程调用的第一行崩溃。
您没有在CreateThread函数调用中传递对“this”的引用。
答案 1 :(得分:2)
您使用空指针调用mythread
。当你将其强制转换为This
时,最终会调用null对象上的函数。当您执行mytestint = 42
时,计算机会将其视为this->mytestint = 42
,并且由于this
为NULL
,您将取消引用空指针,并且程序会出现段错误。您需要执行以下操作:
h = CreateThread(NULL, 0, mythread, (LPVOID)this, 0, NULL);
如果可能的话,我还建议迁移到C ++ 11中引入的标准C ++线程。由于您似乎只是在学习多线程,因此学习标准工具(包含在最新版本的MSVC和GCC中)是特定于副供应商的API。