相关疑难解决方法(0)

在调用std :: getline之前检查数据可用性

我想从我使用的流中读取一些数据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)

c++ iostream

27
推荐指数
3
解决办法
1万
查看次数

如何断言std :: mutex是否被锁定?

使用GCC 4.8.2(在Linux/Debian/Sid 64位上) - 或GCC 4.9(如果可用) - 在C++ 11中 - 我有一些互斥锁

std::mutex gmtx;
Run Code Online (Sandbox Code Playgroud)

实际上,它是一个static在一些类构件Foo含有alphabeta以下的方法.

它被锁定在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不存在......我该如何定义它?(实际上我想确保某个[间接]调用者将互斥锁锁定在同一个线程中...)

(我想测试的原因assertbeta可以在其他地方调用)

我不能使用try_lock …

c++ linux gcc c++11

23
推荐指数
3
解决办法
2万
查看次数

在 std::cin 上发送输入

我正在运行一个带有主线程和辅助线程的程序,并且在满足特定条件后,两者都应该退出。问题是辅助线程,在检查运行条件仍然有效后,使用 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,以便另一个线程将继续执行并退出而无需任何进一步的用户输入。提前致谢

c++ multithreading cin

5
推荐指数
1
解决办法
80
查看次数

标签 统计

c++ ×3

c++11 ×1

cin ×1

gcc ×1

iostream ×1

linux ×1

multithreading ×1