gpt4 book ai didi

C:线程与管道之间的连接,需要同步吗?

转载 作者:行者123 更新时间:2023-11-30 16:36:41 25 4
gpt4 key购买 nike

我正在处理 C 编程中线程之间的管道通信。我有 2 个线程:

-线程1只管理一些事件,

-线程2与串口通信;

线程 1 和 2 与管道通信。

如果存在某些条件,“事件管理器”线程应该向“串行管理器”发送一个字符串,例如pipeline[1],它从串行端口和 pipeline[0] 轮询。然后,如果有来自 pipeline[0] 的字符串,它应该完成他的工作。

问题是线程 1 的写入速度比线程 2 的读取速度快。所以我的问题是:我如何正确地从 pipeline[0] 读取?我如何排队?因为如果我只是以阻塞方式使用 read,只需在线程 2 中输入:

读取(管道[0],字符串,sizeof(字符串)-1)

线程2读取所有线程1的过载消息;

我发现的唯一解决方案是创建另一个管道来阻塞线程1(因为线程1在写入后开始读取,读取是阻塞方式),所以线程1等待直到线程2完成工作(这很有用)因为我可以从 thread2 获得响应,但我的问题是:这是正确的方法吗?我确信我缺少有关读取功能的某些内容。

最佳答案

"[I]s this the correct way [to read variable-length asynchronous messages over a FIFO, processing them one at a time]?"

不,您不需要同步通过 FIFO 向单个消费者发送可变长度消息的单个生产者来一次处理一个消息。

正如您在自己的答案中记录的那样,您可以在消息中添加记录终止符。您可以实现一个简单的协议(protocol)来描述每条消息的长度(参见 netstrings )。

这里有很多以前的实践可供借鉴。例如,您不需要一次读取一个字符的记录终止消息,但可以在本地缓冲部分消息 - 想想 stdio 将字节流转换为行的作用。只有一个消费者这一限制使某些事情变得简单。

"[I]s this the correct way [to send variable-length asynchronous messages between threads]?"

它可以使用,但可能并不理想。

面向消息的排队 channel 可能更适合这里:message queuesdatagram socket pair .

关于C:线程与管道之间的连接,需要同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com