gpt4 book ai didi

c++ - fscanf 不会阻塞调用线程

转载 作者:行者123 更新时间:2023-11-28 00:03:46 25 4
gpt4 key购买 nike

我正在处理 C++ 中的 fscanf 函数,我对 fscanf 感到困惑。为什么它不会在流完全为空时阻塞调用线程。

按我的预期,主线程应该阻塞在 fscanf 函数上,它会在 3 秒后释放,因为文件流将在 3 秒后由子线程写入。

但是现实,似乎并不像我想象的那样。请有人告诉我为什么?

以下是我的代码行:

#include <windows.h>
#include <iostream>
#include <stdio.h>

DWORD WINAPI subroutine(LPVOID data)
{
FILE* file = (FILE*)data;

std::cout << "I'll send you something after 3s" << std::endl;
Sleep(3000);

if (file != NULL)
{
std::cout << "I'm writing now" << std::endl;

char* sentence = "Hello";
fputs(sentence, file);
}
}

int main()
{
FILE* file = tmpfile();

if ( file != NULL )
{
CreateThread(NULL, 0, subroutine, file, 0, NULL);

char something[50];

std::cout << "Blocking..." << std::endl;

rewind(file);
fscanf(file, "%s", something);

std::cout << "Message is " << something << std::endl;
}
std::cout << "Done" << std::endl;

if (file != NULL)
{
fclose(file);
}
return 0;
}

============

因为人们可能不明白为什么我认为 fscanf 应该阻塞调用线程。

这就是为什么我有上述问题。

int main()
{
char something[50];
fscanf(stdin, "%s", something);
std::cout << something << std::endl;
return 0;
}

程序停止让你输入一些东西。

最佳答案

您正在使用一个常规文件,所以当您到达文件末尾时 fscanf 返回 EOF。事实上,有另一个线程将在几秒钟内追加一些数据是无关紧要的,而且 C 库无论如何也无法知道它。

标准输入 block ,因为当它连接到控制台时它不会结束(直到用户按下 Ctrl-D),所以如果你要求更多输入但它还没有准备好接受它就等待(把它想象成如果它是磁盘上的文件非常提供数据)。

此外,使用由实际文件支持的FILE * 进行跨线程通信似乎不是个好主意;除了效率问题和与在两个线程之间共享 FILE * 的线程安全相关的麻烦之外,它还严重映射到手头的问题;您在这里似乎想要的是两个线程之间类似 FIFO 的通信 channel ,而不是数据存储设备。

如果您想在两个线程之间进行 FIFO 通信,您可以使用 - 例如 - 匿名管道或线程安全的消息队列。

关于c++ - fscanf 不会阻塞调用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36954494/

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