PThread在C ++中的类内崩溃

时间:2013-02-04 03:06:58

标签: c++ multithreading class

所以我对一般的线程很新,并且在过去的几周里一直在尝试使用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;时会崩溃?

2 个答案:

答案 0 :(得分:2)

实现线程回调的方式不正确。并且你确定它在整数赋值时崩溃,我认为它必须在你的线程调用的第一行崩溃。

您没有在CreateThread函数调用中传递对“this”的引用。

答案 1 :(得分:2)

您使用空指针调用mythread。当你将其强制转换为This时,最终会调用null对象上的函数。当您执行mytestint = 42时,计算机会将其视为this->mytestint = 42,并且由于thisNULL,您将取消引用空指针,并且程序会出现段错误。您需要执行以下操作:

h = CreateThread(NULL, 0, mythread, (LPVOID)this, 0, NULL);

如果可能的话,我还建议迁移到C ++ 11中引入的标准C ++线程。由于您似乎只是在学习多线程,因此学习标准工具(包含在最新版本的MSVC和GCC中)是特定于副供应商的API。