【问题标题】:Simple question on threads and variable copying (with no need of syncing)关于线程和变量复制的简单问题(无需同步)
【发布时间】:2010-12-01 00:37:10
【问题描述】:

如果我想通过 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,然后忽略程序的其余部分正在执行的操作。他们只是在他们得到的 var 上工作。

【问题讨论】:

    标签: c variables thread-safety pthreads


    【解决方案1】:

    您没有显示程序的“创建变量...”部分的详细信息,但正如克里斯托弗亨特正确回答的那样,如果它没有被声明为静态的,那么它会在 func1() 返回时消失。但更糟糕的是,您说“不需要任何数据通信”,如果您创建一次 var 并从多个线程访问它,无论您是否有意(以及该并行访问的协调),您都在进行“数据通信” var 取决于你)。

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

    【讨论】:

      【解决方案2】:

      您需要注意范围。如果您的 var 在堆栈上声明,那么一旦 func1 完成,它将消失。要么在堆上分配 var,要么作为静态变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        相关资源
        最近更新 更多