我有點困惑如何將對象傳遞給pthread_create函數。我發現很多零散的信息關於轉換爲void *,將參數傳遞給pthread_create等,但沒有任何關聯它們。我只是想確保我將它們聯繫在一起,並沒有做任何愚蠢的事情。假設我有以下線程類: 編輯:固定錯誤匹配static_cast
。鑄造到void *將對象傳遞給pthread在c + +
class ProducerThread {
pthread_t thread;
pthread_attr_t thread_attr;
ProducerThread(const ProducerThread& x);
ProducerThread& operator= (const ProducerThread& x);
virtual void *thread_routine(void *arg) {
ProtectedBuffer<int> *buffer = static_cast<ProtectedBuffer<int> *> arg;
int randomdata;
while(1) {
randomdata = RandomDataGen();
buffer->push_back(randomdata);
}
pthread_exit();
}
public:
ProtectedBuffer<int> buffer;
ProducerThread() {
int err_chk;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);
err_chk = pthread_create(&thread, &thread_attr, thread_routine, static_cast<void *> arg);
if (err_chk != 0) {
throw ThreadException(err_chk);
}
}
~ProducerThread() {
pthread_cancel(&thread);
pthread_attr_destroy(&thread_attr);
}
}
爲了澄清,在ProtectedBuffer
類中的數據只能用像ProtectedBuffer::push_back(int arg)
方法,它使用互斥來保護實際的數據訪問。
我的主要問題是:我正確使用static_cast
嗎?而我的第二個問題是我需要在virtual void *thread_routine(void *arg)
第一行,我複製傳遞的空指針指向ProtectedBuffer
?另外,如果我做了其他任何可能導致問題的東西,我會很高興聽到它。
呃,你不能將成員函數傳給pthread_create,可以嗎? (無關:爲什麼有人需要C++中的線程基類?C++中的多態基類應該具有虛擬析構函數) – 2012-08-08 19:01:13
@ R.MartinhoFernandes:不,它應該是靜態的。 (線程類的'this'可以作爲線程例程的參數,爲線程例程提供狀態。同意。) – jxh 2012-08-08 19:01:54
看看這個:http://stackoverflow.com/questions/8920441/the-fouth-parameter-in -pthread-create-function – PiotrNycz 2012-08-08 19:10:23