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

mythreadnull ポインターで呼び出しています。それを にキャストするとThis、null オブジェクトで関数を呼び出すことになります。を実行するmytestint = 42と、コンピューターはそれを のようthis->mytestint = 42に認識し、それ以降thisNULLヌル ポインターを逆参照し、プログラムはセグメンテーション違反を起こします。次のようなことをする必要があります。

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

可能であれば、C++11 で導入された標準の C++ スレッドに移行することもお勧めします。マルチスレッドを学んでいるように見えるので、標準機能 (MSVC と GCC の最新バージョンに含まれている) とベンダー固有の API を学ぶと役に立ちます。

于 2013-02-04T03:17:56.973 に答える