问题标签 [stdmutex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
256 浏览

c++ - 使用互斥体而不使用条件变量的两个线程之间的 C++ 同步

我有一个线程需要被阻塞,直到另一个线程发生某些事情。这听起来很典型,我有这个解决方案。

这似乎在 Linux 上工作得很好,它不需要条件变量——除了 C++ 标准说两次在同一个线程中获取锁是未定义的行为——我在线程 1 中这样做。

0 投票
2 回答
191 浏览

c++ - 使用 std::mutex 保护 for 循环

我需要使用 for 循环中使用的 std::mutex 来保护数据容器,如下所示:

我可以想到几个选项,但它们像这样丑陋:

有没有一种好看的方法来实现这一点?我正在考虑类似以下(C++ 17)的内容,但这无法编译。:(

或者,

0 投票
1 回答
578 浏览

c++ - 如何解决“命名空间'std'中的'mutex'没有命名类型”?

我的 C++ 文件如下:

当我在 Ubuntu 上编译它时 g++ -std=c++11 -msse2 -fPIC -O3 -ggdb -Wall -finline-functions -I./src -I./include -I/home/hbsun/nccl/ps-lite/deps/include -pthread -c src/postoffice.cc -o build/postoffice.o

我遇到以下问题:

看来我不能使用 std::mutex,我的 g++ 版本是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.,我使用的是 Ubuntu。

0 投票
1 回答
34 浏览

c++ - 一组线程的 C++ 互斥锁

我理解互斥锁的基本原理是保护特定的代码路径不被超过 1 个线程访问。

在我当前的设置中,我有 10 个 A 型线程(A1-A10)和 10 个 B 型线程(B1-B10)。我的意思是,运行无限循环并分别调用方法 A() 和 B() 的线程。从这些方法 A 和 B 中,它们都调用了函数 X()。

我想要做的是,锁定函数 X() 中的代码的某个部分,以便在任何时候从一对 A 和 B (A1:B1, A2:B2 ...) 只有 1 正在访问那个小路。这意味着 A1 位于该代码路径或 B1 中,同样,A2 位于 B2 的代码路径中,依此类推。如果 A1、A2、B3、B4、A5.. 同时访问该代码路径,那很好。只是从 AB 对中只有 1 个线程访问此代码。

我该如何实施?

0 投票
2 回答
223 浏览

c++ - std::atomic 和 std::mutex 的相对性能

我正在考虑为项目实施队列的选项,其要求是生产者至少必须尽可能低延迟。为此,我一直在研究“无锁”队列,std::atomic用于控制生产者和消费者线程对数据结构的访问。我希望这将避免代码当前使用的开销std::mutex,特别是避免开销。std::unique_lock

为此,我编写了一个简单的测试程序来评估std::mutex(加上std::unique_lock)和std::atomic. 该程序还进行检查以确保原子对象是无锁的,它确实是。

运行此程序时,我得到以下输出:

这将向我表明std::mutex(and std::unique_lock) 明显更快,这与我阅读有关原子与互斥锁的期望相反。我的发现正确吗?我的测试程序有问题吗?我对两者之间差异的理解不正确吗?

代码在 CentOS7 上使用 GCC 4.8.5 编译

0 投票
2 回答
381 浏览

c++ - 当缓存线大小通常为 64 字节时,为什么 sizeof std::mutex == 40

在gcc 和 clang 主干中跟随 static_assert传递。

由于 x86 CPU 有 64 字节的高速缓存行,我希望 mutex sizeof 为 64,因此可以避免错误共享。大小“只有”40字节有什么原因吗?

注意:我知道大小也会影响性能,但程序中很少有大量互斥体,因此与错误共享的成本相比,大小开销似乎可以忽略不计。

注意:有一个类似的问题问为什么 std::mutex 这么大,我在问为什么这么小:)

编辑:MSVC 16.7 的大小为 80。

0 投票
1 回答
144 浏览

c++ - c++ 单例在使用互斥锁时是否需要内存屏障?

我知道互斥锁也可以从这里带来作为内存屏障的效果:互斥锁可以替换内存屏障,但是我总是看到在下面的c ++单例示例中使用了内存屏障,内存屏障是否不必要?

0 投票
2 回答
144 浏览

c++ - 为什么 libc++ 允许递归锁定 std::mutex?

std::mutex是非递归的,违反它的是UB。所以理论上一切皆有可能(包括作为std::recursive_mutex)),但 libc++似乎工作正常,这个程序输出

再见

这是 libc++ 中的有意设计决定还是只是一些意外(例如,他们可以对互斥锁和递归互斥锁使用相同的逻辑)?

libstdc++ 挂起。

注意:我知道人们不应该依赖 UB,所以这不是关于最佳实践,我只是对晦涩的实现细节感到好奇。

0 投票
1 回答
61 浏览

c++ - 为什么将 std::mutex 引入成员类会产生此编译错误?

在下面的代码中,class B包含一个成员类数组class A
B::A有一个成员bool和一个成员std::thread
下面的代码编译得很好:

为什么引入 std::mutex 会B::A引入以下编译错误?

如果我正确理解编译错误,它会抱怨如果B::A没有明确构造B::A::mutex_. 但如果这是真的,我不明白为什么这是必要的:std::mutex有一个默认构造函数,所以不需要任何构造函数参数,如下所示:

请帮助我了解上述编译错误的性质,以及适当的修复方法。


更新:@Jarod42 和@chris 似乎发现这是一个编译器错误。我正在更新这个问题,询问是否有人可以解释这个错误的性质——初始化成员数组对象元素似乎是一件简单而基础的事情。什么类型的对象会触发此错误,为什么?我无法想象这可能是一个普遍/易于重现的问题......?


更新:一个不太好的解决方法似乎是创建B::A::A一个空的构造函数并B::A::b_使用右值进行初始化。:(

0 投票
1 回答
41 浏览

c++ - c ++互斥锁不会从内部阻止代码,但允许从外部阻止它

我正在尝试解决下一个问题:

有两种类型的功能。第一种类型可以同时从不同的线程执行(例如 - 从容器中读取数据)。第二个必须阻塞 first-type-function 中的所有线程,直到完成某些操作(例如 - 更改容器)。

我确信这是一项简单的任务,但我找不到解决方案。谁能帮帮我吗?

这是一个简单的例子。我希望线程每 3 秒停止输出 1 秒(我知道这段代码是不安全的(来自不同线程的 cout),但这只是一个简单的例子)