0

所以我对一般的线程很陌生,并且在过去的几周里一直在试验 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;

4

2 回答 2

2

您实现线程回调的方式不正确。你确定它在整数赋值时崩溃了吗,我认为它一定在你的线程回调的第一行崩溃了。

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

于 2013-02-04T03:16:39.337 回答
2

您正在mythread使用空指针调用。当您将其转换为 时This,您最终会在空对象上调用一个函数。当您这样做mytestint = 42时,计算机将其视为this->mytestint = 42,并且因为thisis NULL,您取消引用空指针,并且程序段错误。您需要执行以下操作:

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

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

于 2013-02-04T03:17:56.973 回答