我想用多线程调用一个函数,我只需要将一个整数传递给该函数(线程id,所以如果它是可访问的,我不需要传递值)。
我应该怎么做?
例如:
for(int i=0; i < numberOfThread; i++ ){
pthread_create(&threads[i], NULL, multichaper, &td[i]);
}
其中multichaper是我的函数,threadID是整数。
更新:我将来自user3286661的答案标记为正确答案,这对我有用,如果您想要更详细的答案,可以在答案中查看我自己的问题解决方案。
答案 0 :(得分:1)
这方面的一般方法是制作如下函数:
void* multichaper(void* arg) {
int tid = *(int*)arg;
...
}
在致电pthread_create
时:
pthread_create(&threads[i], NULL, multichaper, &td[i])
其中td[i]
是int
。
答案 1 :(得分:1)
没有。你不能这样做。您传递给pthread_create
的功能必须具有签名void *(*start_routine) (void *)
。也就是说,一个函数将非const指针指向void并将非const指针返回void。
最简单的方法是:
int *arg = new int(threadID);
pthread_create(&threads[i], NULL, multichaper, threadID );
然后multichaper
看起来像:
void *multichaper(void *arg)
{
int *pint = static_cast<int*>(arg);
int threadID = *pint;
delete pint;
...
return nullptr;
}
请注意,我已经在堆上分配了int,以避免担心变量的生命周期。如果你可以保证调用函数中的变量threadID
将比线程更长,那么你可以跳过该位。
我强烈建议您使用C + 11和内置线程库,或者如果您不能这样做,请使用boost :: threads。他们都让这更容易!
答案 2 :(得分:1)
你真的应该考虑转向C ++ 11线程:
#include <thread>
#include <iostream>
void show_id(int id) {
std::cout << id << std::endl;
}
int main()
{
std::thread t(show_id, 10);
t.join();
}
如果你必须使用pthreads,那么:
#include <iostream>
#include <pthread.h>
void *show_id(void *x_void_ptr)
{
const int id = *static_cast<int *>(x_void_ptr);
std::cout << id << std::endl;
return NULL;
}
int main()
{
pthread_t t;
int id = 10;
if(pthread_create(&t, NULL, show_id, &id)) {
std::cerr << "couldn't create" << std::endl;
return -1;
}
if(pthread_join(t, NULL)) {
std::cerr << "couldn't join" << std::endl;
return -2;
}
}
注意第一个版本的好坏:
没有演员阵容
更少的明确检查
您传递的对象的生命周期没有问题 - 在第一个版本中,您将指针传递给它,因此必须确保它已经过去了#34;&#34;活着&#34;线程正在使用它。
没有不直观的void *
返回(具有相同的生命周期问题)。
答案 3 :(得分:0)
由于我想将数字从0传递到NumberOfThreads
到我的函数,我终于使用了下面的代码,通过在struct
内传递一个整数并在尝试检索{时锁定(lock_mutex) {1}}:
在threadNum
class:
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
答案 4 :(得分:-1)
如果您要做的只是将id传递给调用线程,您可以将其隐藏在pthread_create(&threads[i], NULL, multichaper, (void*)threadID );
参数中,并且可以移植。像,
$("<a class='action-button' id='pl65197buy' value='buy now' onclick=\"buy(this, 65197, null, 'pl65197qty',null, '/ajax/buy')\">Bekijk aanbieding</a>").prependTo("div#centerplist");