草庐IT

c++ - c++ 是否存在多生产者单消费者无锁队列?

关闭。这个问题需要更多focused.它目前不接受答案。想要改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestion我读得越多,我就越困惑……我会认为找到一个用C++实现的正式正确的MPSC队列是微不足道的。每当我发现另一个问题时,进一步的研究似乎表明存在诸如ABA或其他微妙的竞争条件之类的问题。很多人都在谈论垃圾收集的必要性。这是我想避免的。那里有公认的正确开源实现吗? 最佳答案 您可能想检查破坏者;它在C++中可用:http://lmax-exchange.g

ruby - 使用 File#flock 作为 ruby​​ 全局锁(进程互斥锁)

经过简短的研究,我发现两个进程之间存在并发问题,我发现temporaryfile是解决此问题的建议方法。因此解决方案是创建/tmp/global.lock并将其用作全局锁。我在这个线程中找到了这样的例子MutexforRailsProcesses到目前为止对我来说很有意义,但我希望看到此解决方案的最佳实践。上面的解释是有道理的,但我想知道如何检查给定文件是否被锁定?fh=File.open("/some/file/path",File::CREAT)beginiflocked=check_file_locked?sleep(1)elsefh.flock(File::LOCK_EX)#d

使用 header `<atomic>` 实现自旋锁的 C++11

我实现了SpinLock类,如下structNode{intnumber;std::atomic_boollatch;voidadd(){lock();number++;unlock();}voidlock(){boolunlatched=false;while(!latch.compare_exchange_weak(unlatched,true,std::memory_order_acquire));}voidunlock(){latch.store(false,std::memory_order_release);}};我实现了上面的类并创建了两个线程,每个线程调用同一Node类

使用 header `<atomic>` 实现自旋锁的 C++11

我实现了SpinLock类,如下structNode{intnumber;std::atomic_boollatch;voidadd(){lock();number++;unlock();}voidlock(){boolunlatched=false;while(!latch.compare_exchange_weak(unlatched,true,std::memory_order_acquire));}voidunlock(){latch.store(false,std::memory_order_release);}};我实现了上面的类并创建了两个线程,每个线程调用同一Node类

c++ - 函数本地静态互斥锁线程安全吗?

在下面的程序中,我尝试制作print通过使用函数本地互斥对象实现函数线程安全:#include#include#include#include#includevoidprint(conststd::string&s){//Threadsafe?staticstd::mutexmtx;std::unique_locklock(mtx);std::cout这安全吗?我的疑惑来自thisquestion,呈现了类似的情况。 最佳答案 C++11在C++11及更高版本中:是的,这种模式是安全的.特别是function-localstatic

c++ - 函数本地静态互斥锁线程安全吗?

在下面的程序中,我尝试制作print通过使用函数本地互斥对象实现函数线程安全:#include#include#include#include#includevoidprint(conststd::string&s){//Threadsafe?staticstd::mutexmtx;std::unique_locklock(mtx);std::cout这安全吗?我的疑惑来自thisquestion,呈现了类似的情况。 最佳答案 C++11在C++11及更高版本中:是的,这种模式是安全的.特别是function-localstatic

c++ - 最优锁文件方法

Windows可以选择以独占访问权限打开文件。Unix没有。为了确保对某些文件或设备的独占访问,在Unix中通常使用通常存储在/var/lock目录中的锁定文件。C指令open("/var/lock/myLock.lock",O_RDWR|O_CREAT|O_EXCL,0666)如果锁文件已经存在则返回-1,否则创建它。该函数是原子的,并确保没有竞争条件。释放资源时,通过如下指令删除锁文件remove("/var/lock/myLock.lock").这种方法有两个问题。程序可能会在不解除锁定的情况下终止。例如,因为它被杀死、崩溃或其他原因。锁定文件保留在原位,即使不再使用该资源,也会

c++ - 最优锁文件方法

Windows可以选择以独占访问权限打开文件。Unix没有。为了确保对某些文件或设备的独占访问,在Unix中通常使用通常存储在/var/lock目录中的锁定文件。C指令open("/var/lock/myLock.lock",O_RDWR|O_CREAT|O_EXCL,0666)如果锁文件已经存在则返回-1,否则创建它。该函数是原子的,并确保没有竞争条件。释放资源时,通过如下指令删除锁文件remove("/var/lock/myLock.lock").这种方法有两个问题。程序可能会在不解除锁定的情况下终止。例如,因为它被杀死、崩溃或其他原因。锁定文件保留在原位,即使不再使用该资源,也会

c++ - 两个 unique_ptr<T> 的无锁交换

交换两个unique_ptr不能保证是线程安全的。std::unique_ptra,b;std::swap(a,b);//notthreadsafe由于我需要原子指针交换,并且我喜欢unique_ptr的所有权处理,有没有一种简单的方法可以将它们结合起来?编辑:如果这是不可能的,我愿意接受替代方案。我至少想做这样的事情:threadshared_unique_ptrglobal;voidf(){threadlocal_unique_ptrlocal(newT(...));local.swap_content(global);//atomicallyforglobal}在C++11中这样

c++ - 两个 unique_ptr<T> 的无锁交换

交换两个unique_ptr不能保证是线程安全的。std::unique_ptra,b;std::swap(a,b);//notthreadsafe由于我需要原子指针交换,并且我喜欢unique_ptr的所有权处理,有没有一种简单的方法可以将它们结合起来?编辑:如果这是不可能的,我愿意接受替代方案。我至少想做这样的事情:threadshared_unique_ptrglobal;voidf(){threadlocal_unique_ptrlocal(newT(...));local.swap_content(global);//atomicallyforglobal}在C++11中这样