gpt4 book ai didi

c - 读取/接收线程安全 (MSG_PEEK)

转载 作者:太空狗 更新时间:2023-10-29 15:40:35 24 4
gpt4 key购买 nike

我有一个线程正在执行阻塞read:

rec = read(socket, data, size);

我很想知道在同一个套接字的后台执行 recv(MSG_PEEK) 对我来说是否安全:

while (true)
{
if (recv(socket, byte, size, MSG_DONTWAIT | MSG_PEEK) > 0)
{
printf("peeked %d", byte);
}
sleep(1);
}

最佳答案

由于系统调用在内核空间中运行,因此它们是线程安全的(它们必须是线程安全的,否则内核数据可能会损坏并导致整个系统崩溃),因为您的程序不会崩溃 - 但是,正如 Jeremy 所指出的弗里斯纳在评论中:

  • 系统调用的执行顺序不一定能得到保证。

  • 系统调用需要时间。这意味着在您对 recv () 的调用之间会漏掉大量数据。


但是,您绝对可以将字节写入命名的 FIFO。在执行read()的线程中打开写入端,在执行recv()的线程中打开读取端。

现在,每次您成功完成 read () 时,将第一个字节(这就是您想要的,是吗?)写入 FIFO。同时,在另一个线程中,不是在 recv () 之间使用 sleep (),而是使用大小为 1 字节的阻塞 read FIFO 和 printf () 结果。

这样,只要有数据要读取,内核就可以自动唤醒你的recv()线程。您也不会在不必要的上下文切换(实际上相当大)上浪费任何 CPU 时间,因此您的应用程序的整体性能/速度也会提高。

关于c - 读取/接收线程安全 (MSG_PEEK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29806135/

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