创建带参数的线程最有效的方法是什么?参数是一个结构体,如果该结构体不能保留在父线程堆栈上,有两种解决方案。
具有动态内存分配
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分配堆栈空间
- 初始化信号量
- 启动线程并切换上下文
- 将变量复制到新堆栈中
-
切换上下文 back
- 销毁信号量
- 分离螺纹
- 切换上下文
或者,你的第一个例子:
- 为Arg分配堆空间
- 启动线程
- 分离螺纹
- 切换上下文
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)