问题标签 [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.
c++ - 使用互斥体而不使用条件变量的两个线程之间的 C++ 同步
我有一个线程需要被阻塞,直到另一个线程发生某些事情。这听起来很典型,我有这个解决方案。
这似乎在 Linux 上工作得很好,它不需要条件变量——除了 C++ 标准说两次在同一个线程中获取锁是未定义的行为——我在线程 1 中这样做。
c++ - 使用 std::mutex 保护 for 循环
我需要使用 for 循环中使用的 std::mutex 来保护数据容器,如下所示:
我可以想到几个选项,但它们像这样丑陋:
有没有一种好看的方法来实现这一点?我正在考虑类似以下(C++ 17)的内容,但这无法编译。:(
或者,
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。
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 个线程访问此代码。
我该如何实施?
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 编译
c++ - c++ 单例在使用互斥锁时是否需要内存屏障?
我知道互斥锁也可以从这里带来作为内存屏障的效果:互斥锁可以替换内存屏障,但是我总是看到在下面的c ++单例示例中使用了内存屏障,内存屏障是否不必要?
c++ - 为什么 libc++ 允许递归锁定 std::mutex?
std::mutex
是非递归的,违反它的是UB。所以理论上一切皆有可能(包括作为std::recursive_mutex
)),但 libc++似乎工作正常,这个程序输出
再见
这是 libc++ 中的有意设计决定还是只是一些意外(例如,他们可以对互斥锁和递归互斥锁使用相同的逻辑)?
libstdc++ 挂起。
注意:我知道人们不应该依赖 UB,所以这不是关于最佳实践,我只是对晦涩的实现细节感到好奇。
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_
使用右值进行初始化。:(
c++ - c ++互斥锁不会从内部阻止代码,但允许从外部阻止它
我正在尝试解决下一个问题:
有两种类型的功能。第一种类型可以同时从不同的线程执行(例如 - 从容器中读取数据)。第二个必须阻塞 first-type-function 中的所有线程,直到完成某些操作(例如 - 更改容器)。
我确信这是一项简单的任务,但我找不到解决方案。谁能帮帮我吗?
这是一个简单的例子。我希望线程每 3 秒停止输出 1 秒(我知道这段代码是不安全的(来自不同线程的 cout),但这只是一个简单的例子)