私は私が実装しようとしている小さなThreadクラスの次のコードスニペットがありますバインディングへのポインタメンバ関数はstdする::ペアと無効にキャスト*
宣言:
template <typename T>
class Thread{
public:
Thread(T*, void (T::*)());
void start();
private:
friend void* createThread(void*);
T* arg; //the object
void (T::*function)(); //the ptr to function in that object of type T
pthread_t thread;
};
を
以下は定義のスニペットです。上記のコードで
template <typename T>
void* createThread(void *arg){
//get back the pair..
std::pair<T*, void (T::*)()>* p = (std::pair<T*, void (T::*)()>*)arg;
//open up the pair
T& t = *p->first;
void (T::*fn)() = p->second;
//TEST
Temp ttt;
ttt.a=100;
(ttt.*fn)(); //segfaults here..
(t.*fn)(); //and even here
}
template <typename T>
void Thread<T>::start(){
//pair of pointer to object, and the pointer-to-member-function
std::pair<T*, void (T::*)()> p(arg,function);
pthread_create(&thread, NULL, createThread<T>, (void*)&p);
}
、Temp
機能およびフィールド 'A' を持つクラスです。スレッドは次のコードで実行されます。
Temp t;
t.a=11;
Thread<Temp> tt(&t, &Temp::function);
tt.start();
なぜコードがsegfaultsなのでしょうか?メンバ関数へのポインタがvoid *へのキャストと実際にうまくいっていないことを思い出します。それはここにあるのですか(私はそれを直接行っていないからです)?
どのようなポインタ/提案も高く評価されます。
ありがとうございます! :)
どうしたことがありますか?私はそれをあきらめるために私の心の外だった! :P ありがとうイーサン、おかげでトン! :) – user1103651
@ user1103651 pthread_createに引数をバインドしようとしたときと全く同じ間違いを犯しました。誰もがC++でセグメンテーションを持っています。 – Lalaland