我想从我使用的流中读取一些数据std::getline.下面是一个使用的样本std::cin.
std::string line;
std::getline( std::cin, line );
Run Code Online (Sandbox Code Playgroud)
这是一个阻塞函数,即如果没有数据或行读取它阻止执行.
你知道在调用之前是否存在检查数据可用性的函数std::getline吗?我不想阻止.
如何检查流缓冲区是否满足成功调用的数据std::getline?
无论如何看起来像下面的代码
if( dataAvailableInStream() )
{
std::string line;
std::getline( std::cin, line );
}
Run Code Online (Sandbox Code Playgroud) 使用GCC 4.8.2(在Linux/Debian/Sid 64位上) - 或GCC 4.9(如果可用) - 在C++ 11中 - 我有一些互斥锁
std::mutex gmtx;
Run Code Online (Sandbox Code Playgroud)
实际上,它是一个static在一些类构件Foo含有alpha与beta以下的方法.
它被锁定在alpha像
void alpha(void) {
std::lock_guard<std::mutex> g(gmtx);
beta(void);
// some other work
}
Run Code Online (Sandbox Code Playgroud)
我想检查beta确实gmtx是锁定的:
void beta(void) {
assert (gmtx.is_locked());
// some real work
}
Run Code Online (Sandbox Code Playgroud)
(注意is_locked只在内部调用assert......它可能非常低效甚至有时不准确)
当然,我还有其他函数调用beta,例如
void gamma(void) {
std::lock_guard<std::mutex> g(gmtx);
beta();
// some other work
}
Run Code Online (Sandbox Code Playgroud)
但is_locked不存在......我该如何定义它?(实际上我想确保某个[间接]调用者将互斥锁锁定在同一个线程中...)
(我想测试的原因assert是beta可以在其他地方调用)
我不能使用try_lock …
我正在运行一个带有主线程和辅助线程的程序,并且在满足特定条件后,两者都应该退出。问题是辅助线程,在检查运行条件仍然有效后,使用 std::cin 等待用户输入,因此如果在调用 std::cin 后满足条件,则线程继续等待用户输入。代码是这样的:
MainThread()
{
std::thread t1{DoOtherWork}
...
while(condition)
{
DoWork();
}
t1.join();
}
DoOtherWork()
{
while(condition)
{
char c;
std::cin >> c;
ProcessInput(c);
}
return;
}
Run Code Online (Sandbox Code Playgroud)
因此,当不再满足条件时,两者都应该退出,但程序会卡在等待用户输入。如果我只是输入任何随机字符并按回车键,程序就会正常退出。
我的问题是,在加入辅助线程之前,主线程是否有任何方法可以将一些输入发送到 std::cin,以便另一个线程将继续执行并退出而无需任何进一步的用户输入。提前致谢