gpt4 book ai didi

c++ - 线程参数的高效快速方法

转载 作者:太空狗 更新时间:2023-10-29 21:50:53 25 4
gpt4 key购买 nike

创建带参数的线程的最有效方法是什么?参数是一个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)比上下文切换便宜得多。考虑在你的第二个例子中需要发生什么:

  1. 为Arg分配堆栈空间
  2. 初始化信号量
  3. 启动线程并切换上下文
  4. 将变量复制到新堆栈
  5. 切换上下文回来
  6. 销毁信号量
  7. 分离线程
  8. 切换上下文

或者,您的第一个示例:

  1. 为Arg分配堆空间
  2. 开始话题
  3. 分离线程
  4. 切换上下文

关于c++ - 线程参数的高效快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com