相关疑难解决方法(0)

为什么C需要挥发性?

为什么volatileC需要?它是干什么用的?它会做什么?

c declaration volatile

396
推荐指数
15
解决办法
27万
查看次数

为什么volatile在多线程C或C++编程中不被认为有用?

正如我最近发布的这个答案所示,我似乎对volatile多线程编程环境中的实用程序(或缺乏实用程序)感到困惑.

我的理解是这样的:每当一个变量可以在访问它的一段代码的控制流之外被改变时,该变量应该被声明为volatile.信号处理程序,I/O寄存器和由另一个线程修改的变量都构成这种情况.

所以,如果你有一个全局int foo,并且foo由一个线程读取并由另一个线程原子设置(可能使用适当的机器指令),则读取线程看到这种情况的方式与它看到由信号处理程序调整的变量或由外部硬件条件修改,因此foo应该声明volatile(或者,对于多线程情况,使用内存隔离负载访问,这可能是一个更好的解决方案).

我怎么错,哪里错了?

c c++ multithreading volatile c++-faq

159
推荐指数
8
解决办法
6万
查看次数

num ++是'int num'的原子吗?

一般地,对于int num,num++(或++num),作为读-修改-写操作中,是不是原子.但我经常看到编译器,例如GCC,为它生成以下代码(在这里尝试):

在此输入图像描述

由于第5行对应于num++一条指令,我们可以得出结论,在这种情况下num++ 是原子的吗?

如果是这样,是否意味着如此生成num++可以在并发(多线程)场景中使用而没有任何数据争用的危险(例如,我们不需要制作它,std::atomic<int>并强加相关成本,因为它是无论如何原子)?

UPDATE

请注意,这个问题不是增量是否原子的(它不是,而且是问题的开头行).它是否可以在特定场景中,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销.而且,作为公认的答案约单处理器的机器,还有部分提到这个答案,在其评论和其他人谈话解释,它可以(尽管不是C或C++).

c c++ assembly multithreading atomic

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

多线程程序停留在优化模式下,但在-O0下正常运行

我编写了一个简单的多线程程序,如下所示:

static bool finished = false;

int func()
{
    size_t i = 0;
    while (!finished)
        ++i;
    return i;
}

int main()
{
    auto result=std::async(std::launch::async, func);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    finished=true;
    std::cout<<"result ="<<result.get();
    std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它通常表现在调试模式下在Visual Studio中-O0GC c和后打印出的结果1秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3

c++ multithreading thread-safety data-race

67
推荐指数
3
解决办法
5653
查看次数

指针声明为常量和易失性

在阅读时我遇到了这种类型的声明和以下行 -

const volatile char *p=(const volatile char *) 0x30;
Run Code Online (Sandbox Code Playgroud)

p的值仅由外部条件改变

我没有得到什么是外部条件.还有这种宣言的实际用途是什么?

c const volatile

63
推荐指数
6
解决办法
2886
查看次数

C/C++基本类型是原子的吗?

是C/C++的基本类型,如int,double等,原子,如线程?

他们是否免于数据竞赛; 也就是说,如果一个线程写入这种类型的对象而另一个线程从中读取,那么行为是否定义明确?

如果没有,它是否依赖于编译器或其他东西?

c c++ multithreading atomic

58
推荐指数
4
解决办法
7349
查看次数

为什么编译器没有合并多余的std :: atomic写入?

我想知道为什么没有编译器准备将相同值的连续写入合并到单个原子变量,例如:

#include <atomic>
std::atomic<int> y(0);
void f() {
  auto order = std::memory_order_relaxed;
  y.store(1, order);
  y.store(1, order);
  y.store(1, order);
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的每个编译器都会发出三次上面的编写.什么合法的,无种族的观察者可以看到上述代码与具有单次写入的优化版本之间的差异(即,不是"假设"规则适用)?

如果变量是易变的,那么显然不适用优化.在我的情况下有什么阻止它?

这是编译器资源管理器中的代码.

c++ multithreading compiler-optimization c++11 stdatomic

47
推荐指数
5
解决办法
4494
查看次数

每个memory_order是什么意思?

我读了一章,我不喜欢它.我还不清楚每个内存顺序之间的差异.这是我目前的推测,我在阅读更简单的http://en.cppreference.com/w/cpp/atomic/memory_order后理解这一点.

以下是错误的,所以不要试图从中学习

  • memory_order_relaxed:当从另一个原子var中的另一个模式完成订单时,不同步但不被忽略
  • memory_order_consume:Syncs读取这个原子变量然而它没有同步在此之前写的轻松变量.但是,如果线程在修改Y(并释放它)时使用var X. 消耗Y的其他线程也将看到X发布?我不知道这是否意味着这个线程推出了x的变化(显然是y)
  • memory_order_acquire:同步读取这个原子变量并确保在此之前写入的轻松变量同步.(这是否意味着所有线程上的所有原子变量都被同步?)
  • memory_order_release:将原子存储推送到其他线程(但仅当它们使用consume/acquire读取var时)
  • memory_order_acq_rel:用于读/写操作.获取是否因此您不修改旧值并释放更改.
  • memory_order_seq_cst:与获取版本相同的东西,除了它强制在其他线程中看到更新(如果a在另一个线程上放宽了存储.我b用seq_cst 存储.第三个线程读取a 放松将看到变化以及b任何其他原子变量? ).

如果我错了,我想我理解但是纠正我.我找不到任何用易于阅读的英语解释它的东西.

c++ atomic memory-model thread-safety c++11

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

互斥锁功能是否足够而没有易失性?

我和同事为在x86,x64,Itanium,PowerPC和其他10年历史的服务器CPU上运行的各种平台编写软件.

我们刚刚讨论了pthread_mutex_lock()... pthread_mutex_unlock()等互斥函数本身是否足够,或者受保护变量是否需要是volatile.

int foo::bar()
{
 //...
 //code which may or may not access _protected.
 pthread_mutex_lock(m);
 int ret = _protected;
 pthread_mutex_unlock(m);
 return ret;
}
Run Code Online (Sandbox Code Playgroud)

我担心的是缓存.编译器是否可以在堆栈或寄存器中放置_protected的副本,并在赋值中使用该陈旧值?如果没有,是什么阻止了这种情况发生?这种模式的变化是否易受攻击?

我假设编译器实际上并不理解pthread_mutex_lock()是一个特殊函数,所以我们只是受序列点保护吗?

非常感谢.

更新:好的,我可以看到一个趋势,答案解释了为什么不稳定是坏的.我尊重这些答案,但有关该主题的文章很容易在网上找到.我在网上找不到的,以及我问这个问题的原因,就是我如何保护我没有不稳定.如果上面的代码是正确的,那么缓存问题如何无懈可击?

c++ multithreading mutex volatile memory-barriers

39
推荐指数
3
解决办法
7299
查看次数

如何干净地退出线程C++程序?

我正在我的程序中创建多个线程.按下时Ctrl-C,将调用信号处理程序.在一个信号处理程序里面,我exit(0)终于放了.问题是,有时程序安全终止,但有时,我得到运行时错误说明

abort() has been called
Run Code Online (Sandbox Code Playgroud)

那么避免错误的可能解决方案是什么?

c++ multithreading signals exit

31
推荐指数
3
解决办法
8253
查看次数