これらは、SteveJessopのCソリューションをC++に再定式化したものにすぎません。これらのおもちゃの例(エラーチェックがないことに注意)は、テンプレートを使用して、以外のタイプを使用するようにコードを変更する方法を明確にしますdouble
。たとえば、作業の完了後に複数の値を返す必要がある場合double
は、を型に置き換えることができます。class
実際には、基本クラスとテンプレートは削除される可能性が高く、のwork()
メソッドはMyWorker
仮想メソッドを介さずに呼び出し元によって直接呼び出されます。
まず、:を使用しpthread
ます
#include <iostream>
#include <pthread.h>
class WorkerBase {
protected: virtual ~WorkerBase () {}
public: virtual void * work () = 0;
};
template <typename T>
struct Worker : public WorkerBase { T result; };
extern "C" void *invoke_worker (void *arg) {
return static_cast<WorkerBase *>(arg)->work();
}
struct MyWorker : public Worker<double> {
void * work () {
result = 4.2;
return 0;
}
};
int main () {
pthread_t t;
MyWorker w;
pthread_create(&t, 0, invoke_worker, &w);
pthread_join(t, 0);
std::cout << "result: " << w.result << std::endl;
return 0;
}
次に、C ++11を使用しますstd::thread
。
#include <iostream>
#include <thread>
class WorkerBase {
protected: virtual ~WorkerBase () {}
public: virtual void work () = 0;
static void invoke (WorkerBase *w) { w->work(); }
};
template <typename T>
struct Worker : public WorkerBase { T result; };
class MyWorker : public Worker<double> {
void work () { result = 4.2; }
};
int main () {
MyWorker w;
std::thread t(MyWorker::invoke, &w);
t.join();
std::cout << "result: " << w.result << std::endl;
return 0;
}
あなたは私が見逃したあなたの投稿に別の質問がありました:
また、10個の位置と10個のpthreadの静的配列が毎回異なる位置を変更している場合、問題が発生しますか?
これで問題が発生するかどうかは、配列要素のタイプとハードウェアアーキテクチャによって異なります。実際には、これがマシンワードの境界に配置された配列要素のx86アーキテクチャで問題になることは確認していません。