正如我想通过使整数a struct
内部和锁定(lock_mutex),其以号码传递从0到NumberOfThreads
到我的函数I最终使用下面的代码,试图检索threadNum
时:
在调用多线程功能SVAnchor
类的成员函数:
pthread_t threads[this->numberOfThread];
pthread_attr_t attr;
params_t params;
pthread_mutex_init (¶ms.mutex , NULL);
pthread_cond_init (¶ms.done, NULL);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for(int i=0; i < this->numberOfThread; i++){
params.id = i;
params.ptr = this;
rc = pthread_create(&threads[i], NULL, &(SVAnchor::multichaperWrapper), ¶ms);
pthread_cond_wait (¶ms.done, ¶ms.mutex);
}
pthread_attr_destroy(&attr);
void* status;
for(int i=0; i < this->numberOfThread; i++)
rc = pthread_join(threads[i], &status);
pthread_mutex_destroy (¶ms.mutex);
pthread_cond_destroy (¶ms.done);
与params_t
如下:
struct params {
SVAnchor* ptr;
pthread_mutex_t mutex;
pthread_cond_t done;
int id;
};
typedef struct params params_t;
然后multichaperWrapper
如下:
void* SVAnchor::multichaperWrapper(void* arg){
return (((params*)arg)->ptr)->multichaper( ((params*)arg));
}
和multichaper
如下:
void* SVAnchor::multichaper(void *threadarg /*0 <= threadNum < numberofthreads*/){
int threadNum;
/* Lock. */
pthread_mutex_lock(&(*(params_t*)(threadarg)).mutex);
/* Work. */
threadNum = (*(params_t*)(threadarg)).id;
/* Unlock and signal completion. */
pthread_mutex_unlock(&(*(params_t*)(threadarg)).mutex);
pthread_cond_signal (&(*(params_t*)(threadarg)).done);
cout<<threadNum<<endl;
...
}
非常感谢,该作品 – ameerosein
@ameerosein:你能*保证*线程将在'td [i]'超出范围之前结束吗?当你在调试器中进行测试时,或者甚至在测试时很容易做到这一点 - 但是对于你传递给'multichaper'的地址在线程有机会读取之前消失的事情重载生产服务器。 –
@ user3286661你可以检查这个问题吗? http://stackoverflow.com/questions/39656285/how-to-multithreading-a-function-of-a-class-with-pthreads – ameerosein