创建带参数的线程的最有效方法是什么?参数是一个struct,如果这个struct不能留在父线程栈上,有两种解决方法。
使用动态内存分配
struct Arg{
int x;
int y;
};
void* my_thread(void* v_arg){
Arg* arg = (Arg*) v_arg;
//... running
delete arg;
return NULL;
}
//Creating a thread
void a_function(){
Arg* arg = new Arg;
arg->x = 1; arg->y = 2;
pthread_t t;
pthread_create(&t, NULL, my_thread, arg);
pthread_detach(t);
}
带信号量
struct Arg{
sem_t sem;
int x;
int y;
};
void* my_thread(void* v_arg){
Arg* arg = (Arg*) v_arg;
int arg_x = v_arg->x;
int arg_y = v_arg->y;
sem_post( &(v_arg->sem) );
//... running
return NULL;
}
//Creating a thread
void a_function(){
Arg arg;
arg.x = 1; arg.y = 2;
sem_init( &(arg.sem), 0, 0);
pthread_t t;
pthread_create(&t, NULL, my_thread, &arg);
pthread_detach(t);
sem_wait( &(arg.sem) );
sem_destroy( &(arg.sem) );
}
我使用 Linux 和 Windows。
最佳答案
在您发布的代码中,最有效的实现是使用堆分配(您的第一个示例)。这样做的原因是堆分配(使用 new() 或 malloc)比上下文切换便宜得多。考虑在你的第二个例子中需要发生什么:
- 为Arg分配堆栈空间
- 初始化信号量
- 启动线程并切换上下文
- 将变量复制到新堆栈
- 切换上下文回来
- 销毁信号量
- 分离线程
- 切换上下文
或者,您的第一个示例:
- 为Arg分配堆空间
- 开始话题
- 分离线程
- 切换上下文
关于c++ - 线程参数的高效快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032651/