相关疑难解决方法(0)

如何检查std :: thread是否仍在运行?

如何检查a std::thread是否仍在运行(以独立于平台的方式)?它缺乏一种timed_join()方法,joinable()并不适用于此.

我想std::lock_guard在线程中使用a锁定互斥锁并使用try_lock()互斥锁的方法来确定它是否仍然被锁定(线程正在运行),但对我来说似乎不必要的复杂.

你知道更优雅的方法吗?

更新:要明确:我想检查线程是否干净地退出.为此,"悬挂"线程被认为正在运行.

c++ multithreading c++11 stdthread

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

为什么sizeof(bool)没有被标准本身定义为一个?

C++标准本身的大小char,signed char并且unsigned char被定义为1个字节.我想知道它为什么没有定义sizeof(bool)呢?

C++ 03标准$ 5.3.3/1说,

sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1; sizeof应用于任何其他 基本类型(3.9.1)的结果是实现定义的.[注意:特别是sizeof(bool)和sizeof(wchar_t)是实现定义的 .69)

我理解sizeof(bool)不能小于一个字节的基本原理.但有没有理由说它为什么应该大于1个字节呢?我并不是说实现将它定义为大于1,但是标准使它被实现定义为好像它可能大于1.

如果没有理由sizeof(bool)大于1,那么我不明白为什么标准没有1 byte像它定义的那样定义它sizeof(char),而且它是所有变体.

c++ standards boolean sizeof

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

我必须使用atomic <bool>作为"exit"bool变量吗?

我需要为另一个线程设置一个标志来退出.另一个线程会不时检查退出标志.我是否必须使用原子作为旗帜或只是一个普通的布尔就足够了(为什么(如果我使用普通布尔可能会出错的例子)?

#include <future>
bool exit = false;
void thread_fn()
{
    while(!exit)
    {
        //do stuff
        if(exit) break;
        //do stuff
    }
}
int main()
{
    auto f = std::async(std::launch::async, thread_fn);
    //do stuff
    exit = true;
    f.get();
}
Run Code Online (Sandbox Code Playgroud)

c++ atomic c++11

30
推荐指数
2
解决办法
6434
查看次数

bool读/写操作可以在x86上不是原子操作吗?

假设我们有两个线程,一个是在循环中读取bool而另一个可以在特定时间切换它.我个人认为这应该是原子的,因为sizeof(bool)在C++中是1个字节而你不是部分读/写字节但我想100%肯定.

那么是或否?

编辑:

另外供将来参考,同样适用于int

c++ x86 boolean atomic

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

C/C++和C#/ Java之间使用volatile的区别是什么?

我在许多参考文献中发现它提到volatile在C/C++中很弱并且可能在多处理器的并发环境中引起问题,但它(volatile)可以用作C#/ Java中差异CPU之间的通信机制.看起来这个关键字在C#/ Java中比在C/C++中更严格,但它们之间的差异/影响是什么?

这是volatileC/C++ 的参考. 为什么volatile在多线程C或C++编程中不被认为有用?

c c# c++ java concurrent-programming

14
推荐指数
3
解决办法
5340
查看次数

CRITICAL_SECTION用于设置和获取单个bool值

现在写class得很复杂,觉得我用得太多了CRITICAL_SECTION.

据我所知,某些类型的原子操作总是在没有任何硬件或软件中断的情况下执行.

我想检查一下我是否理解正确.

  • 要设置或获取原子值,我们不需要CRITICAL_SECTION因为这样做不会有中断.
  • bool 是原子的.

所以有我的陈述,想问一下,如果它们是正确的,如果它们是正确的,那么什么类型的变量也可以设置或没有CRITICAL_SECTION

PS我在谈论为每种方法获取或设置一个单值,而不是两个,而不是五个,而是一个.

c c++ windows winapi multithreading

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

C++ 的双重检查锁有什么潜在问题吗?

这是用于演示的简单代码片段。

有人告诉我,双重检查锁不正确。由于变量是非易失性的,编译器可以自由地重新排序调用或优化它们(有关详细信息,请参阅 codereview.stackexchange.com/a/266302/226000)。

但是我真的看到很多项目中确实使用了这样的代码片段。有人可以对这个问题有所了解吗?我用谷歌搜索并和我的朋友谈论它,但我仍然找不到答案。

#include <iostream>
#include <mutex>
#include <fstream>

namespace DemoLogger
{
    void InitFd()
    {
        if (!is_log_file_ready)
        {
            std::lock_guard<std::mutex> guard(log_mutex);
            if (!is_log_file_ready)
            {
                log_stream.open("sdk.log", std::ofstream::out | std::ofstream::trunc);
                is_log_file_ready = true;
            }
        }
    }


    extern static bool is_log_file_ready;
    extern static std::mutex log_mutex;
    extern static std::ofstream log_stream;
}

//cpp
namespace DemoLogger
{
    bool is_log_file_ready{false};
    std::mutex log_mutex;
    std::ofstream log_stream;
}
Run Code Online (Sandbox Code Playgroud)

更新:谢谢大家。InitFd()确实有更好的实现,但它确实只是一个简单的演示,我真正想知道的是,双重检查锁定是否存在任何潜在问题。

有关完整的代码片段,请参阅https://codereview.stackexchange.com/questions/266282/c-logger-by-template

c++ multithreading mutex locking atomic

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

假设在没有锁定的线程中更改全局 bool 变量是崩溃安全的是否安全?

我知道这是未定义的行为。因此存在数据竞争或崩溃的可能性。可以使用atomicbool来避免这种可能性。我有兴趣了解有关碰撞安全的信息。

AFAIU,当一个线程读取另一个线程部分写入或撕裂的值时,可能会发生崩溃。另一方面, bool 的大小是由实现定义的,但让它大于数据模型中指针的大小几乎没有意义。

假设 bool 的内存块将被更新或不更新是否安全?因此,其他线程无法读取撕裂值,因此从不同线程读取/写入全局布尔值是安全的吗?

c++ multithreading boolean c++11

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

make_pair是原子的吗?

std::pair<Object, OtherObject*> currentData;

void OnCallback()
{
    Object object = getObject();
    OtherObject* otherObject = new OtherObject();
    currentData = std::make_pair(object, otherObject);
}
Run Code Online (Sandbox Code Playgroud)

make_pair原子?将make_pair字段从其返回值复制或移动到currentData?如果我有另一个线程访问该值currentData,那么访问它时是否有任何潜在currentData的价值不完整?

不幸的是,我没有在标准文档中看到任何相关信息make_pair.

c++ thread-safety atomicity

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