C pthreads:如何从主线程启动一个线程

3
我正在使用一个带有Embedded Linux(C)的ARM处理器。我的主要程序需要执行实时操作,在一定时间段之后(由主程序确定),我必须通过蓝牙连接将数据发送到Android平板电脑。
我想将蓝牙数据传输外包给POSIX线程。现在在主函数中,我必须触发线程来执行数据发送。那么如何“重新启动”线程呢?因为它应该只在主函数需要发送时通过蓝牙发送数据。这也不利于在线程函数中使用循环(结合睡眠函数),因为正如我已经说过的,节奏由主函数而不是线程函数本身决定。
那么有没有重新启动线程的选项?或者如果有更好的解决此问题的方法,我也很愿意尝试。 :)
2个回答

5
最简单的方法是使用同步例程。Semaphore就是一个很好的选择:
thread() {
    for (;;) {
        sem_wait(&semaphore);
        send_data(...);
    }
}

main() {
    get_data();
    pus_data_in_a_buffer();
    sem_post(&semaphore);
    // ...
}

但如果您只需要异步发送数据,则可以查看异步IO库aio(7)


1
啊,是的,这实际上是一个相当简单和不错的解决方案。在主函数中,当有数据包可用时,我可以增加信号量,在线程中,我只需持续检查它是否为0。如果它不等于0,则通过蓝牙发送数据。我希望这就是你想要的方式!:) 谢谢。 - BGWH

0

你可以让线程循环,检查发送缓冲区是否准备好发送,如果没有准备好,则短暂地暂停。虽然不是每种情况都理想,但你确实可以让线程保持循环并等待有事情要做。

请注意,这并非在所有情况下都实用,但因为你已经提到这是一个实时场景,这可能是维护最佳性能的最佳选择,因为信号量可能会比较昂贵(就处理时间而言)。如果你不需要这样的优化,那么使用信号量可能更安全。


这种情况并不罕见,而且非常糟糕。线程几乎从不需要循环/检查/暂停。 - Martin James
@MartinJames,是的,但这样的数据通信,无论是蓝牙接口还是RS232(或其他),我想使用线程是一个非常常见的应用。不是吗?那么现在有什么更好的想法呢? - BGWH
请不要再设计轮询线程。使用显式信号、互斥量、信号量、事件等。想要笔记本电脑有8小时的电池续航而不是6小时吗?不要轮询。 - Zan Lynx
这完全取决于上下文。我曾经在一个环境中工作,我们无法承受使用信号量和互斥锁带来的性能损失,因此我们不得不依靠循环和检查。在其他情况下,这远非理想,但在我们的情况下几乎是必要的。显然,我们的代码并没有在笔记本电脑上运行;它是为数据中心的高性能服务器设计的。 - pattivacek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接