相关疑难解决方法(0)

什么时候使用volatile多线程?

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

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

c++ concurrency multithreading atomic volatile

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

C++是否读取和写入了原子?

我有两个线程,一个更新一个int,另一个读取它.这是一个统计值,其中读取和写入的顺序无关紧要.

我的问题是,我是否需要同步访问这个多字节值?或者,换句话说,写入的一部分可以完成并被中断,然后读取就会发生.

例如,假设值= 0x0000FFFF,其值递增为0x00010000.

是否有时间值看起来像0x0001FFFF,我应该担心?当然,类型越大,发生这种情况的可能性就越大.

我总是同步这些类型的访问,但很好奇社区的想法.

c++ multithreading synchronization

79
推荐指数
4
解决办法
3万
查看次数

C++中的原子性:神话还是现实

我一直在阅读一篇关于MSDN中的无锁编程的文章.它说 :

在所有现代处理器上,您可以假设自然对齐的本机类型的读取和写入 是原子的.只要存储器总线至少与读取或写入的类型一样宽,CPU就会在单个总线事务中读取和写入这些类型,这使得其他线程无法在半完成状态下看到它们.

它给出了一些例子:

// This write is not atomic because it is not natively aligned.
DWORD* pData = (DWORD*)(pChar + 1);
*pData = 0;

// This is not atomic because it is three separate operations.
++g_globalCounter;

// This write is atomic.
g_alignedGlobal = 0;

// This read is atomic.
DWORD local = g_alignedGlobal;
Run Code Online (Sandbox Code Playgroud)

我读了很多答案和评论说,没有什么能保证在C++中是原子的,甚至在标准中都没有提到,在SO中,现在我有点困惑.我误解了这篇文章吗?或者文章作者是否谈论了非标准和特定于MSVC++编译器的内容?

所以根据这篇文章,下面的作业必须是原子的,对吧?

struct Data
{
    char ID;
    char pad1[3];
    short Number;
    char pad2[2];
    char Name[5];
    char pad3[3];
    int Number2;
    double …
Run Code Online (Sandbox Code Playgroud)

c++ atomic memory-alignment

33
推荐指数
2
解决办法
1万
查看次数

64 位计算机上的哪些类型在 gnu C 和 gnu C++ 中自然是原子的?-- 意味着它们具有原子读取和原子写入

注意:对于这个问题,我不是在谈论 C 或 C++语言标准。相反,我谈论的是针对特定体系结构的 gcc 编译器实现,因为语言标准对原子性的唯一保证是使用_AtomicC11 或更高版本中的类型或std::atomic<>C++11 或更高版本中的类型。另请参阅我在这个问题底部的更新。

在任何体系结构上,某些数据类型可以原子方式读取和写入,而其他数据类型则需要多个时钟周期,并且可能在操作中间被中断,如果跨线程共享该数据,则会导致损坏。

8 位单核 AVR 微控制器(例如:Arduino Uno、Nano 或 Mini 使用的 ATmega328 mcu)上,只有8 位数据类型具有原子读取和写入(使用 gcc 编译器和gnu C 或gnu C++语言)。我在不到 2 天的时间里进行了 25 小时的马拉松式调试,然后在这里写下了这个答案。另请参阅此问题的底部以获取更多信息。以及有关使用 AVR-libc 库的 gcc 编译器编译时 AVR 8 位微控制器具有自然原子写入和自然原子读取的 8 位变量的文档。

(32 位)STM32 单核微控制器上,任何32 位或更小的数据类型绝对自动是原子的(当使用 gcc 编译器和 gnu C 或 gnu C++ 语言编译时,因为ISO C 和 C++ 不保证这一点直到 2011 年版本,_Atomic类型为 C11 …

c c++ gcc x86-64 atomic

10
推荐指数
2
解决办法
1787
查看次数

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

CRITICAL_SECTION用于设置和获取单个bool值

现在写class得很复杂,觉得我用得太多了CRITICAL_SECTION.

据我所知,某些类型的原子操作总是在没有任何硬件或软件中断的情况下执行.

我想检查一下我是否理解正确.

  • 要设置或获取原子值,我们不需要CRITICAL_SECTION因为这样做不会有中断.
  • bool 是原子的.

所以有我的陈述,想问一下,如果它们是正确的,如果它们是正确的,那么什么类型的变量也可以设置或没有CRITICAL_SECTION

PS我在谈论为每种方法获取或设置一个单值,而不是两个,而不是五个,而是一个.

c c++ windows winapi multithreading

4
推荐指数
1
解决办法
495
查看次数

如果我确定每个线程总是将相同的值写入共享内存,我应该使用锁吗?

C++ :我有一个vector<bool>,没有线程会向任何索引写入 false 。我还应该使用锁吗?我认为它不会导致竞争条件,因为所有线程都在写入相同的 value 。多个线程访问的函数如下所示:

void setVal(int index) 
{
  if (boolvec[index] == false)
    boolvec[index] = true; 
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading operating-system vector

3
推荐指数
1
解决办法
84
查看次数