草庐IT

c++ - 为什么标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?

假设架构可以以无锁方式支持std::atomic的8字节标量。为什么标准库不为小于8字节的结构提供类似的特化?这种std::atomic特化的简单实现可以将结构序列化/反序列化(使用std::memcpy)到等效的std::uintx_t中x是结构的宽度(以位为单位)(四舍五入到最接近的大于或等于结构宽度的2的幂)。这将被很好地定义,因为std::atomic要求这些结构可以简单地复制。例如。https://godbolt.org/z/sxSeId,这里的Something只有3个字节,但是实现调用了__atomic_load和__atomic_exchange,两者都使用了锁表。

c++ - 从 GCC 原子操作构建的轻量级自旋锁?

我想在我的项目中尽量减少同步并尽可能编写无锁代码。当绝对必要时,我喜欢用原子操作构建的轻量级自旋锁代替pthread和win32互斥锁。我的理解是,这些是底层的系统调用,可能会导致上下文切换(对于非常快速的关键部分来说,这可能是不必要的,在这些部分中,简单地旋转几次会更可取)。我所指的原子操作在此处有详细记录:http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Atomic-Builtins.html这里有一个例子来说明我在说什么。想象一个可能有多个读者和作者的RB树。RBTree::exists()是只读的并且是线程安全的,RBTree::inse

c++ - 在 C\C++ 中实现多生产者/消费者无锁队列

我已经在无锁队列上完成了单个生产者/消费者的基本实现,并且运行良好。但是,当我尝试将其扩展到多个生产者/消费者时,我开始遇到冲突。我通过SO找到了与此问题相关的类似帖子(Istheresuchathingasalocklessqueueformultiplereadorwritethreads?),并且我发现了一篇文章,该文章对原始实现进行了更深入的介绍。我也对这篇文章感到困惑,希望得到一些指导。首先是这个实现在使用多个生产者/消费者时是否真的有效,或者我在使用多个生产者/消费者设置的原始Michael-Scott实现中是否缺少某些东西。第二篇在文章AnOptimisticApproa

Redis实战——Redisson分布式锁

目录1基于Redis中setnx方法的分布式锁的问题2Redisson        2.1什么是Redisson        2.2Redisson实现分布式锁快速入门        2.3Redisson可重入锁原理                什么是可重入锁?                Redisson中又是如何实现的呢?        2.4Redisson分布式锁的可重试性        2.5Redisson分布式锁的主从一致性(MutiLock锁)1基于Redis中setnx方法的分布式锁的问题之前我们使用setnx方法自定义的分布式锁,仍然会有许多的问题:主要分为下面5

c++ - 我可以为那些知道互斥锁密码的进程全局创建 Windows 互斥锁吗?

我想使用WinAPI、CreateMutex()和OpenMutex()创建Windows互斥。但出于安全考虑,我希望互斥量由知道“密码”或硬编码魔术代码的进程打开。我不希望每个进程都访问互斥量。例如,创建名称为“Globel\cd689f00-0462-11e5-b939-0800200c9a66”的互斥锁。所以只有知道互斥锁名称的进程才能访问这个互斥锁。但这不是一个好的解决方案,因为您可以简单地使用Winobj.exe,并且您仍然有机会找到这个互斥体。我希望这个互斥体受到ACL(访问控制列表)之类的保护。问题是,我找不到为ACL创建自己的SID的方法。这是我所知道的和我想要的:1.

windows - 如何使用批处理文件获得文件的独占锁?

我有一个项目,我需要监控一个不断运行的批处理文件,看看它是否仍在运行。我有一台远程机器需要监控在另一台服务器上运行的这个批处理文件。我需要做的是让批处理文件创建并独占锁定一个文本文件(可以是空的,也可以是满的,没关系)。这样我就可以从我的远程机器(使用由c#创建的exe)轮询它以查看文件是否有独占锁——如果有,则什么也不做。如果可以锁定,则发出警报(因为批处理失败)。了解这可能不是最好的方法,但不幸的是,这是我必须采用的方法。那么,有没有办法使用批处理文件(自动)独占锁定文件? 最佳答案 起初我对此持怀疑态度,但事实证明这可以通过使

c++ - 为什么图书馆要在 Windows 上实现自己的基本锁?

Windows提供了许多对同步线程有用的对象,例如事件(使用SetEvent和WaitForSingleObject)、互斥锁和临界区。我个人一直使用它们,尤其是关键部分,因为我很确定除非已经锁定,否则它们只会产生很少的开销。然而,看看许多库,例如boost,人们会在Windows上使用互锁方法来实现自己的锁会很麻烦。我能理解为什么人们会编写无锁队列等,因为那是一种特殊情况,但是人们选择实现他们自己版本的基本同步对象有什么理由吗? 最佳答案 图书馆没有实现自己的锁。如果没有操作系统支持,这几乎是不可能做到的。他们正在做的只是包装操作

windows - Linux 自旋锁与 NT KeAcquireSpinLock

据我所知:NT的KeAcquireSpinLock等同于spin_lock_bh:一个将IRQL提升到DISPATCH_LEVEL,另一个屏蔽下半部分中断-功能相同。虽然NT变体保留了OldIrql,但Linux变体似乎没有在任何地方存储“wereInterruptsAlreadyMasked”。这是否意味着spin_unlock_bh总是揭开他们的面纱?NT的KeAcquireInterruptSpinLock类似于spin_lock_irqsave。spin_lock在NT中的等价物是什么?如果spin_unlock_bh总是取消屏蔽中断(在NT语言中,总是将IRQL降到spin_

Java 文件锁定和 Windows - 锁不是 "absolute"吗?

我正在尝试使用FileLock在Windows环境中使用Java锁定文件我遇到了一个问题:在我锁定文件后,它仍然可以被其他进程访问,至少在某种程度上是这样。示例代码如下:publicclassSimpleLockExample{publicstaticvoidmain(String[]args)throwsException{Stringfilename="loremlipsum.txt";Filefile=newFile(filename);RandomAccessFileraf=newRandomAccessFile(file,"rw");FileChannelchannel=ra

c++ - 结构的互锁交换

我想使用WinAPI中的InterlockedExchange来使用线程的无锁同步。目前我有这样的类(class)。structDataExchange{volatileLONGm_value;voidSetValue(LONGnewVal){InterlockedExchange(&m_value,newVal);}LONGGetValue(){LONGworkVal=0;InterlockedExchange(&workVal,m_value);returnworkVal;}};一个线程可以设置一个新值,另一个线程可以读取这个值。现在我要做的是将LONG值更改为struct。在Wi