相关疑难解决方法(0)

什么时候使用volatile多线程?

如果有两个线程访问全局变量,那么许多教程都说使变量volatile变为阻止编译器将变量缓存在寄存器中,从而无法正确更新.但是,访问共享变量的两个线程是通过互斥锁来调用保护的东西不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有那个线程可以访问变量,在这种情况下变量不需要是volatile?

那么多线程程序中volatile的用途/目的是什么?

c++ concurrency multithreading atomic volatile

121
推荐指数
3
解决办法
5万
查看次数

在处理易失性存储器位置时,编译器必须遵循什么规则?

我知道当从几个线程或进程写入的内存位置读取时,volatile属性应该用于该位置,就像下面的一些情况一样,但我想知道更多关于它对编译器的实际限制,基本上是什么规则编译器在处理这种情况时必须遵循,并且有任何例外情况,尽管可以同时访问存储器位置,但程序员可以忽略volatile关键字.

volatile SomeType * ptr = someAddress;
void someFunc(volatile const SomeType & input){
 //function body
}
Run Code Online (Sandbox Code Playgroud)

c++ memory compiler-construction rules volatile

12
推荐指数
4
解决办法
5157
查看次数

相邻内存区域的memcpy()安全性

我最近提出了一个关于使用volatile的问题,并被指示阅读英特尔和其他人讨论内存障碍及其用途的一些非常有用的文章.看完这些文章后,我变得非常偏执.

我有一台64位机器.从多个线程记忆到相邻的,非重叠的内存区域是否安全?例如,假设我有一个缓冲区:

char buff[10];
Run Code Online (Sandbox Code Playgroud)

一个线程是否总是安全地记忆到前5个字节,而第二个线程复制到最后5个字节?

我的直觉反应(和一些简单的测试)表明这是完全安全的,但我无法在任何可以完全说服我的文件中找到文档.

c++ multithreading memcpy

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

关于挥发性使用的规则是严格的吗?

我看过这句话:

一般规则是,如果你有必须在多个线程之间共享的基本类型的变量,则声明那些变量 volatile

这篇文章,这句话:

通常,任何可以异步发音的数据都应声明为volatile.

这个页面,现在考虑这个引入的规则我想知道你能带一个案例的例子,尽管存在对数据的异步访问,声明数据volatile在实践中没用,或者没有这样的例外情况和规则是严格的.

c++ multithreading rules volatile

4
推荐指数
2
解决办法
4136
查看次数