C/C++开发
我对 C++11 中 thread_local 的描述感到困惑.我的理解是,每个线程在函数中都有唯一的局部变量副本.所有线程都可以访问全局/静态变量(可能使用锁进行同步访问).thread_local 变量对所有线程都是可见的,但只能由为其定义的线程修改?这是正确的吗? 解决方案 线程局部存储持续时间是一个术语,用于指看似全局或静态的存储持续时间(从使用它的函数的角度来看)但在实际上,每个
..
我在安装 MinGW-w64 工具链时选择了 Win32 线程模型,在阅读它之后,它提供了比 POSIX 对应的更好的性能.我自己没有资格对此声明进行基准测试,但是 这里是它的来源. 起初我认为这个选项只会影响 GCC 运行时的内部工作,而不会阻止我在我的代码中使用 C++11 线程,基于 此答案 和此评论 来自其他用户 rubenvb. 然而,情况似乎并非如此.std::thread 在
..
我对 std::condition_variable 的使用有点困惑.我知道我必须在调用 condition_variable.wait() 之前在 mutex 上创建一个 unique_lock.我找不到的是我是否应该在调用 notify_one() 或 notify_all() 之前获取唯一锁. cppreference.com 上的示例相互矛盾.例如,notify_one 页面给出了这
..
如何检查 std::thread 是否仍在运行(以独立于平台的方式)?它缺少 timed_join() 方法,而 joinable() 并不适用于此. 我想过在线程中用std::lock_guard锁定一个互斥锁,并使用互斥锁的try_lock()方法来判断它是否仍然被锁定(线程正在运行),但对我来说似乎不必要地复杂. 你知道更优雅的方法吗? 更新: 明确地说:我想检查线程是否干
..
好吧,我在使用 std::thread 将数据传递到线程时遇到了问题.我以为我了解复制构造函数等的一般语义,但似乎我不太明白这个问题.我有一个名为 Log 的简单类,它因此隐藏了它的复制构造函数: 类日志{民众:Log(const char filename[], const bool outputToConsole = false);虚拟〜日志(无效);//修改行为void appendStr
..
当试图回答另一个 Stackoverflow 问题,我意识到这个简单的 C++11 代码段隐式地阻塞了调用线程: std::async(std::launch::async, run_async_task) 对我来说,这似乎是规范的 C++11 异步启动任务而不关心结果的方式.相反,为了实现这一点,必须明显地创建和分离一个线程(参见 answer 提到的问题).> 所以这是我的问题:std:
..
我正在寻找一个好的 C++ 读写锁.我们有一个用例,有一个不频繁的作者和许多频繁的读者,并希望为此进行优化.最好我想要一个跨平台的解决方案,但是只有一个 Windows 是可以接受的. 解决方案 较新版本的 boost::thread 具有读/写锁(1.35.0 及更高版本,显然以前的版本无法正常工作). 他们的名字是shared_lock、unique_lock 和 upgrade
..
我想知道为什么没有编译器准备将相同值的连续写入合并到单个原子变量,例如: #include std::atomicy(0);无效 f() {自动订购 = std::memory_order_relaxed;y.store(1, 订单);y.store(1, 订单);y.store(1, 订单);} 我尝试过的每个编译器都会发出上述写入的 3 次.哪个合法的、无种族的观察者可以看到上述代码与经过
..
我有两个线程,一个更新一个 int 一个读取它.这是一个与读写顺序无关的统计值. 我的问题是,我是否需要同步访问这个多字节值?或者,换句话说,可以部分写入完成并被中断,然后读取发生. 例如,考虑一个值 = 0x0000FFFF,它的增量值为 0x00010000. 有没有我应该担心值看起来像 0x0001FFFF 的时候?当然,类型越大,这种事情发生的可能性就越大. 我一直
..
我正在尝试并行化以下程序,但不知道如何减少数组.我知道这是不可能的,但有没有其他选择?谢谢.(我在 m 上添加了reduce,这是错误的,但想就如何做到这一点提出建议.) #include #include #include #include 使用命名空间标准;int主(){int A [] = {84, 30, 95, 94, 36, 73, 52, 23, 2, 13};整数 S [10];
..
我有几个线程都运行相同的功能.在其中的每一个中,它们都会多次生成不同的随机数.我们试图通过将 srand(time(0)) 放在函数的开头来做到这一点,但它们似乎都得到了相同的数字. 我们是否需要每个程序只调用一次 srand(time(0)) ,即在 main 的开头(例如),在每个程序的开头被多次调用的函数,还是别的什么? 解决方案 srand() 种子随机数生成器.您应该只需要
..
为什么在创建 std::thread 时不能通过引用传递对象? 例如下面的代码段给出了一个编译错误: #include #include 使用命名空间标准;static void SimpleThread(int& a)//编译错误//static void SimpleThread(int a)//OK{cout
..
嗨,我正在尝试将 std::thread 与 G++ 一起使用.这是我的测试代码 #include #include int main(int, char **){std::thread tt([](){ std::cout
..
我写了一个简单的多线程程序如下: static bool 完成 = false;函数函数(){size_t i = 0;而(!完成)++i;返回我;}int main(){自动结果=std::async(std::launch::async, func);std::this_thread::sleep_for(std::chrono::seconds(1));完成=真;std::cout
..
我正在实现一个基于此算法的无锁队列,它使用一个计数器来解决 ABA 问题.但我不知道如何用 c++11 CAS 实现这个计数器.例如从算法: E9: if CAS(&tail.ptr->next, next, ) 这是一个原子操作,意思是如果tail.ptr->next等于next,让tail.ptr->nextcode> 指向 node 并同时(原子地)使 next.count+1.但是,使
..
假设我正在启动一个 std::thread 然后 detach() 它,所以即使 std::thread 曾经代表它,超出了范围. 进一步假设程序没有可靠的加入分离线程的协议1,所以当main()退出时分离线程仍然运行. 我在标准中找不到任何内容(更准确地说,在 N3797 C++14 草案中),它描述了应该发生的情况,1.10 和 30.3 都没有包含相关的措辞. 1 另一个可
..
C++11 引入了标准化的内存模型,但这究竟是什么意思?它将如何影响 C++ 编程? 本文(作者:Gavin克拉克引用Herb Sutter) 说, 内存模型意味着C++代码现在有一个标准化的库可以调用不管是谁做的编译器以及它在什么平台上运行.有一个标准的方法来控制如何不同的线程与处理器的内存. "当你在谈论分裂时[代码] 跨不同内核在标准中,我们正在谈论内存模型.我们准备去优化
..
我有一个多线程应用程序,它必须经常读取一些数据,并且偶尔会更新这些数据.现在互斥锁可以安全地访问该数据,但它很昂贵,因为我希望多个线程能够同时读取,并且仅在需要更新时将它们锁定(更新线程可以等待其他线程完成). 我认为这是 boost::shared_mutex 应该做的,但我不清楚如何使用它,也没有找到一个明确的例子. 有没有人有一个简单的例子可以让我开始使用? 解决方案 看
..
有人可以发布一个在 C++ 中启动两个(面向对象)线程的简单示例. 我正在寻找可以扩展运行方法(或类似的东西)而不是调用 C 样式线程库的实际 C++ 线程对象. 我省略了任何特定于操作系统的请求,希望回复的人会回复要使用的跨平台库.我现在只是明确说明这一点. 解决方案 创建一个你想让线程执行的函数,例如: void task1(std::string msg){std::c
..
一个全局变量在 2 个不同内核上的 2 个并发运行线程之间共享.线程写入和读取变量.对于原子变量,一个线程可以读取一个陈旧的值吗?每个内核可能在其缓存中都有一个共享变量的值,当一个线程写入缓存中的副本时,不同内核上的另一个线程可能会从其自己的缓存中读取过时的值.或者编译器执行强内存排序以从另一个缓存中读取最新值?c++11 标准库有 std::atomic 支持.这与 volatile 关键字有何
..