是否需要将互斥锁锁定才能将参数传递给pthread?

时间:2019-08-07 04:35:35

标签: c++ struct arguments pthreads mutex

我有一个将被多次调用的函数,该函数将在每次调用时创建一个新的pthread。而且我需要在每次创建pthread时将一些使用struct的参数传递给pthread。

每当将参数传递给pthread时,是否需要对那些结构(在创建pthread的函数中)进行互斥锁锁定?

请告知。

1 个答案:

答案 0 :(得分:0)

  

每次创建它时,我都需要使用struct将一些参数传递给pthread。

我想您必须遵循以下这些意思:

struct args {
    int arg1;
    double arg2;
    char *arg3;
};

void *thread_func(void *p) {
    struct args *args = p;

    // ... do something with args ...

    return some_value;
}

// ...

void foo() {
    pthread_t tid;
    struct args *args;
    // ...
    args = some_expression;
    pthread_create(&tid, NULL, thread_func, args);
    // ...
}
  

是否需要对这些结构进行互斥锁(在   将参数传递给的函数(创建pthread的函数)   pthread?

仅在函数foo()中使用互斥对任何人都没有好处。互斥仅在两个不同的代码段之间提供同步,而这两个代码段都成功锁定了同一段代码(必要时在不同的时间)。

通常,启动新线程会将新线程中的所有操作与父线程中线程启动之前的所有操作同步。特别是,新线程可以读取自变量结构的内容而无需任何特殊措施,也不会引起数据争用,假设没有其他线程修改该结构,并且该结构的生存期不会过期。新线程甚至可以在没有数据争用的情况下修改参数结构,提供,根本没有其他线程可以访问它,并且生存期不会过期。

但是,正如上面的条款所建议的那样,肯定仍然会有麻烦的方式。适当地在双边或多边使用互斥体可以解决某些此类问题,但不能解决其他问题。例如,如果提供给新线程的args结构实际上是启动该线程的函数的自动变量,并且该线程实际上是通过提供的指针访问该结构的,则新线程之间存在潜在的数据竞争访问结构并终止其生命周期。例如,

void foo() {
    pthread_t tid;
    struct args args;  // an automatic variable
    // ...
    pthread_create(&tid, NULL, thread_func, &args);
    // ...
    // the lifetime of args ends when control reaches here
}

在这种情况下,您需要确保新线程在foo()(在另一个线程中运行)返回之前执行对args结构的所有访问。互斥锁(单独)无法为您做到这一点-相反,您需要条件变量(必须与互斥锁一起使用),信号量或多种其他替代方法之一。