【问题标题】:Confused about pthreads对 pthread 感到困惑
【发布时间】:2014-02-07 17:52:56
【问题描述】:

首先,我是 pthreads 的新手,所以如果我完全误解了,请告诉我。

我搜索了返回值的正确方法,发现了这个链接 How to return a value from thread in Chttps://linuxprograms.wordpress.com/category/pipes/

所以我可以共享由起始线程或管道信息控制的位置,但最后一个值不能放在某个堆栈上?为什么我不能像 shell(如 bash)调用程序时那样 return

(据我了解,如果它是 C++,则可能有一个常规返回值,但是(根据我读到的内容,我认为这里可能是 https://computing.llnl.gov/tutorials/pthreads/)POSIX 并没有完全为 C++ 定义,只是 C .)

【问题讨论】:

  • 建议:std::thread
  • 听起来你正在寻找pipe()而不是线程......你是在加入后获得“返回值”吗??
  • AnotherTest,std::thread 不是 C++11 的 pthread 实现吗? πάντα ῥεῖ,不,它必须使用 pthread。
  • @ConfusedStack pthreads 提供pthread_join()!!那么没有什么?你似乎真的很困惑......

标签: c++ c pthreads posix


【解决方案1】:

看看 pthread_exit 和 pthread_join。

当你完成你的线程后,你可以调用pthread_exit(void* retval)

pthread_exit() 函数终止调用线程并返回 通过 retval 的值(如果 thread is joinable) 可用于调用 pthread_join(3) 的同一进程中的另一个线程。

对 pthread_exit 的调用将停止您的线程,并且正如它所说,将返回值存储在 pthread_join 可以访问的位置并将其放入第二个参数中:int pthread_join(pthread_t thread, void **retval);

当您调用pthread_join(tid, &returnVal);(其中 tid 是一个 pthread_t)时,returnVal 现在将保存一个指向返回给pthread_exit 的值的指针

这允许您在线程退出时将数据从线程中传递出去。

【讨论】:

  • &retval 将类似地保存从线程过程本身返回的看似经常被忽略的void* 的值,如果pthread_exit调用线程,而是选择简单地让线程过程完成和return something。我更喜欢这种方法,特别是当我有需要销毁的本地范围 C++ 对象时。
【解决方案2】:

每个线程都有自己的堆栈和本地环境与父进程。您的主进程创建一个线程(主线程),您的代码在其下运行。您创建的任何其他线程都得到相同的处理:每个线程都有一个堆栈、一个线程上下文、线程本地存储(如果适用)并且没有公共堆栈来返回一个值。

当你加入一个你开始的线程时,你实际上是在等待它完成执行。这将解除阻塞等待,但不会返回任何用户值,因为通常线程、它的堆栈以及进程内的所有环境都被破坏了。 在线程运行时,它们可以按照您提到的方式相互通信,并且只要您使用同步机制来序列化这些访问,它们也可以读取/写入公共内存位置。

如果你的线程必须有一个返回值,那么你可能想将它封装在一个类中,在启动时将类实例传递给它,然后在线程退出之前,它可以在一个“返回值”中留下一个此类的成员,因此您可以在类“run”或“start”方法(实际运行线程的方法)返回后对其进行检查。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-13
    • 2012-07-22
    • 2013-05-13
    • 2020-04-16
    • 2023-03-08
    • 2019-08-04
    • 2019-12-30
    • 2022-01-20
    相关资源
    最近更新 更多