0

次のクラスがあるとします。

* .h :

class MyClass{
    void caller();
    int threadProcuder(void *args);
};

* cpp :

void MyClass::caller()
{
    pthread_t i;
    pthread_create(&i,NULL,(void*(*)(void*))&MyClass::threadProcedure,(void*)this);
}

int MyClass::threadProcedure(void *args) 
{
    cout << "body of thread" << endl;
}

残念ながら、スレッドは実行されません。

4

3 に答える 3

5

正しい方法は次のとおりです。

// Must declare the callback is extern "C" 
// As you are calling back from a C library.
// As this is compiles as C it can only call functions that use the C ABI
// There is no guarantee in the C++ standard that static member functions
// use the same ABI as a "C" function.
//
// Certain C++ ABI definitions do make this explicit but using this knowledge
// Renders your code non portable. If you use a C++ static member it will likely
// break in the future and when it does tracking down the problem will be nearly
// imposable.
extern "C" void* threadProcuder(void *args);

class MyClass{
    void caller();
    void* threadProcuder();
};

void MyClass::caller()
{
    // NOTE: This function should NOT be called from the constructor.
    //       You should really wait until the object is fully constructed
    //       before letting a thread run around inside your object
    //       otherwise the thread may will start playing with members that
    //       are not fully constructed.
    pthread_t i;
    pthread_create(&i,NULL,&threadProcedure,this);
}

void* threadProcuder(void *args)
{
    // I use reinterpret_cast<> here to make it stand out.
    // Others prefer static_cast<>. Both are valid and guaranteed to work.
    // Casting a pointer to/from void* is guaranteed by the standard
    MyClass* obj    = reinterpret_cast<MyClass*>(args);
    void*    result = NULL;
    try
    {
        result = obj->threadProcuder();
    }
    catch(...) {}   // you MUST catch all exceptions
                    // Failing to do so is very undefined.
                    // In most pthread_application allowing exceptions to escape
                    // usually (but not always) leads to application termination.
    return result;
}
于 2012-07-31T14:43:29.120 に答える
1

編集:に渡される関数はpthread_create宣言する必要がありますextern "C"。これが当てはまる理由についてのより良い説明については、https://stackoverflow.com/a/2068048/786714を参照してください。

私の元の回答が述べたように、静的メンバー関数を使用することはできませんが、未定義の動作として機能する可能性があります。

于 2012-07-31T13:34:37.047 に答える
0

私はそれを解決しました、私のフォーマットは正しいです、私はコンストラクターを呼び出しませんでした。

于 2012-07-31T13:27:56.690 に答える