相关疑难解决方法(0)

我什么时候真的需要使用原子<bool>而不是bool?

不是atomic<bool>多余的,因为bool它本质上是原子的吗?我认为不可能有部分修改的bool值.我什么时候真的需要用atomic<bool>而不是bool

c++ atomicity c++11 stdatomic

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

获取std :: future的状态

是否可以检查a std::future是否已经完成?据我所知,唯一的方法就是调用wait_for零持续时间并检查状态是否ready存在,但是有更好的方法吗?

c++ multithreading future c++11

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

是否有必要使用std :: atomic来表示线程已完成执行?

我想检查一下是否std::thread已完成执行.搜索stackoverflow我发现以下问题解决了这个问题.接受的答案建议让工作线程在退出之前设置变量并让主线程检查该变量.以下是此类解决方案的最小工作示例:

#include <unistd.h>
#include <thread>

void work( bool* signal_finished ) {
  sleep( 5 );
  *signal_finished = true;
}

int main()
{
  bool thread_finished = false;
  std::thread worker(work, &thread_finished);

  while ( !thread_finished ) {
    // do some own work until the thread has finished ...
  }

  worker.join();
}
Run Code Online (Sandbox Code Playgroud)

对已接受的答案发表评论的人声称,不能使用简单的bool变量作为信号,代码在没有内存屏障的情况下被破坏并且使用std::atomic<bool>是正确的.我最初的猜测是这是错误的,简单bool就足够了,但我想确保我没有错过任何东西.以上代码是否需要a std::atomic<bool>才能正确?

假设主线程和worker正在不同套接字中的不同CPU上运行.我认为会发生的是,主线程thread_finished从其CPU的缓存中读取.当worker更新它时,缓存一致性协议负责将worker更改为全局内存并使主线程的CPU缓存无效,因此它必须从全局内存中读取更新的值.缓存一致性的全部要点是不能像上面的代码一样工作吗?

c++ c++11 stdthread stdatomic

16
推荐指数
2
解决办法
3072
查看次数

C++ 11 future.wait_for()总是返回future_status :: timeout

我有一个C++ 11程序,检查一个数字是否为素数.程序等待准备就绪的未来对象.准备就绪后,程序会告诉未来对象的提供者功能是否认为该数字是素数.

// future example
#include <iostream>       // std::cout
#include <future>         // std::async, std::future
#include <chrono>         // std::chrono::milliseconds


const int number = 4; // 444444443

// a non-optimized way of checking for prime numbers:
bool is_prime (int x) {
    for (int i=2; i<x; ++i) if (x%i==0) return false;
      return true;
    }

int main ()
{
    // call function asynchronously:
    std::future<bool> fut = std::async (is_prime, number); 

    // do something while waiting for function to set future:
    std::cout << "checking, please wait"; …
Run Code Online (Sandbox Code Playgroud)

c++ future compiler-bug c++11

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

等待 std::thread 完成

我试图在程序终止时优雅地清理,所以我正在调用join()astd::thread等待它完成。这似乎只是永远阻塞了主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:

void GameLoop::Run()
{
    while (run)
    {
        //  Do stuff... 
    }   
    std::cout << "Ending thread...\n";
}
Run Code Online (Sandbox Code Playgroud)

当然,我runjoining之前设置为 false 。现在,我怀疑它与它是一个成员函数并在 object destroy 时被调用有关。我正在创建这样的线程:runThread.reset(new thread(&GameLoop::Run, this));, where runThreadisunique_ptr<std::thread>GameLoop. 该join()电话打进来的的析构函数GameLoop对象。

如果它的对象正在被销毁,循环线程可能无法完成?根据调试器的说法,循环线程在msvcr120d.dll. 如果是这样,你会如何处理?

当心:新来的std::thread

更新:这是我加入析构函数的呼吁:

run = false;
if (runThread->joinable())
{
    runThread->join();
}
Run Code Online (Sandbox Code Playgroud)

更新2:如果我删除join()我得到引发异常~thread()

c++ multithreading c++11 stdthread

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

C++异步编程,如何不等待未来?

我正在尝试用 C++ 学习异步编程。在 Python 中,我们有await,我们可以从那个点恢复函数,但在 C++ 中future等待结果并停止下一行代码。如果我们不想得到结果,而是继续下一行代码怎么办?我怎样才能做到这一点?

c++ multithreading asynchronous c++17

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