2010-12-01 34 views
0

如果我想通过pthread_create()将char *传递给各个线程,并且我希望它们独立工作,那么安全地使用它最简单的方法是什么?关于线程和可变复制的简单问题(不需要同步)

我发现我得到不稳定的行为,如果我做

伪代码:

func1() { // part of a loop 
    Create var.. 
    func2(var); 
} 

func2(char* var) { // spawn a thread 
    pthread_create(.....,&func3,(void*)var); 
} 

func3(void* var) { 
    work with the var // unstable behavior 
} 

没有必要进行任何数据通信,线程刚刚得到的VAR,然后忽略什么程序的其余部分是在做。他们只是在他们得到的变种上工作。

回答

1

您不会显示程序的“Create var ...”部分的详细信息,但正如Christopher Hunt正确回答的,如果它没有声明为静态,那么当func1()返回时它将消失。但更糟糕的是,你说“不需要任何数据通信”,并且如果你创建了一次var并从多个线程访问它,那么无论你是否意味着“数据通信”(以及协调并行访问到var是由你决定的)。

如果您希望每个线程真正拥有自己的副本,可以在不干扰其他线程的情况下搞砸,您可以在每次调用pthread_create()之前复制它。例如,您可以调用strdup()为新线程分配字符串的私有副本,并将该副本传递给pthread_create()。

0

您需要小心范围。如果您的var在堆栈中声明,那么一旦func1完成,它就会消失。要么在堆上分配var,要么作为静态分配。