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

标签 c++ c multithreading performance pthreads

创建带参数的线程的最有效方法是什么?参数是一个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/

相关文章:

c - 如何让第二个 printf 在执行 scanf 时出现?

c - R 中是否有比 readLines 更快的东西 - 或者我如何找出读取连接速度如此慢的原因?

c++ - GLIBCXX 版本

c++ - 我应该先学习哪个: Boost or Qt

c++ - 以纵横比旋转二维 vector

java - 如何用停止按钮停止执行?

android - 在android中设置录音的时间限制

c++ - 有关解决此图像处理挑战的指示?

c - memcpy 和 "alias"的奇怪行为

c# - 在 C# 中使数据集线程安全