这些只是将Steve Jessop 的 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 个 pthreads 每次修改不同的位置,我会遇到麻烦吗?
这是否会给您带来麻烦可能取决于数组元素类型和您的硬件架构。在实践中,对于在机器字边界上对齐的数组元素,我没有观察到这在 x86 架构上是一个问题。