【问题标题】:C - Thread result in mainC - 主线程结果
【发布时间】:2014-10-08 17:55:12
【问题描述】:

我正在学习 C,但我的书提供的资源很少。我想知道这是否可能,并且使用线程来详细说明某些内容然后将结果传递给主线程很有用。以防万一,我想知道如何将信息从线程传递到主线程(类似于java中的方法返回)。唯一的解决方案是使用全局变量? 这是一个小例子来解释我想做的事情。这可能/有用吗?

主要:

int i = 1;
pthread_create(tid,NULL,functionTH,NULL);
int z = //getResultFromThread

线程“函数”:

void * functionTH(){
    int z = 2;
    //return value 2 to the main and assign it to k in the main.
}

【问题讨论】:

    标签: c multithreading return


    【解决方案1】:

    pthread_create的原型。

    int pthread_create(pthread_t *restrict thread,
           const pthread_attr_t *restrict attr,
           void *(*start_routine)(void*), void *restrict arg);
    

    您的线程 (start_routine) 是一个返回 void * 的函数。所以你的代码是错误的,因为你的线程函数什么都不返回。你可以猜到,你通过返回一个指针来向你的主线程返回一个值。

    您可以通过调用pthread_join 等待线程完成读取此值。您从线程返回的值通过 value_ptr 参数传递。

    pthread_join() 函数应暂停调用的执行 线程直到目标线程终止,除非目标线程 已经终止。从成功的 pthread_join() 返回时 使用非 NULL value_ptr 参数调用,传递给的值 终止线程的 pthread_exit() 应在 value_ptr 引用的位置。

    当然,您不必使用这种机制。全局变量可以正常工作,但您必须同步对变量的访问,否则最终会出现竞争条件。

    【讨论】:

    • mm 但是 value_ptr 在 pthread_join 和 pthread_exit 中都应该是一个 void,那么我怎样才能通过它传递一个 INT 呢?
    • 您可以将(void *) 的指针转换为例如struct 将包含您的ik
    • @daimpa: 你可以想象这样一种情况,你可以在struct中定义你想要传递或返回的所有数据,然后用malloc分配结构,通过在我们的线程中指向它的指针,然后让该数据的接收者free 完成后该数据。这就是您从线程中获取大量数据的方式。但通常你只需要一个整数,将其转换为指针 (void *)22 就足够了。
    • @daimpa: ...你用-lpthread链接到pthread库了吗?例如,gcc -o program program.c ‑lpthread
    • @daimpa:不,这没有错。我真的无法为我从未使用过的特定 IDE 提供技术支持,所以如果你不知道在哪里添加 -lpthread,也许可以提出一个新问题。
    【解决方案2】:

    内存在线程之间共享,因此很容易使用queues 传递指针(每个线程使用一个队列)。另外,请记住使用mutex locks 和其他concurrency control techniques

    这是另一个 S.O 帖子,展示了如何实现 message passing between threads using queues

    这篇题为“Queues, Mutexes, Semaphores..”的文章很好地解释了在使用 C 语言构建多线程程序时必须考虑的所有竞争条件和临界区注意事项。

    如果您有兴趣了解性能,Bartosz Milewski 的题为“Beyond Locks and Messages: The Future of Concurrent Programming”的文章很好地将共享内存和消息传递并列在一起,并深入了解了事务性内存的优势和传统内存的劣势锁。

    如果您有任何问题,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2019-08-18
      相关资源
      最近更新 更多