草庐IT

lock-free

全部标签

c++ - std::lock_guard 导致未定义的行为

编辑:看起来,问题是我实际上并没有创建一个lock_guard的本地实例,而只是一个匿名的临时实例,它立即再次被销毁,如下面的评论所指出的。Edit2:启用clang的线程清理器有助于在运行时查明这些类型的问题。它可以通过启用clang++-std=c++14-stdlib=libc++-fsanitize=thread*.cpp-pthread这在某种程度上可能是一个重复的问题,但我找不到任何东西,所以如果它真的是重复的,我很抱歉。无论如何,这应该是一个初学者问题。我正在玩一个简单的“Counter”类,比如在文件中内联计数器.hpp:#ifndefCLASS_COUNTER_HPP

c++ - C++ 中的读写线程安全智能指针,x86-64

我开发了一些无锁数据结构,但出现了以下问题。我有一个编写器线程,它在堆上创建对象并将它们包装在带有引用计数器的智能指针中。我也有很多阅读线程,它们与这些对象一起工作。代码可能如下所示:SmartPtrptr;classReader:publicThread{virtualvoidRun{for(;;){SmartPtrlocal(ptr);//dosmth}}};classWriter:publicThread{virtualvoidRun{for(;;){SmartPtrnewPtr(newObject);ptr=newPtr;}}};intmain(){Pool*pool=Syst

c++ - 当我们有 new/delete 时,为什么要使用 malloc/free?

当我们在C++中有new和delete时,malloc和free有什么用。我想free和delete的功能是一样的。 最佳答案 它们不一样。new调用构造函数,malloc只是分配内存。此外,它是未定义的行为将两者混合(即使用new与free和malloc与删除).在C++中,你应该使用new和delete,malloc和free是为了与C的兼容性原因。 关于c++-当我们有new/delete时,为什么要使用malloc/free?,我们在StackOverflow上找到一个类似的问题

c++ - std::lock_guard 有什么问题

我有简单的代码:第一个线程将std::strings推送到std::list,第二个线程弹出std::strings从这个std::list。所有std::list的操作都受到std::mutexm的保护。此代码将错误永久打印到控制台:"Error:lst.begin()==lst.end()"。如果我将std::lock_guard替换为构造m.lock()和m.unlock()代码将开始正常工作。std::lock_guard有什么问题?#include#include#include#include#includestd::mutexm;std::listlst;voidf2()

c++ - 如果使用 delete 而不是 free 删除使用 malloc 分配的内存怎么办

我遇到了一个我无法解决的问题。我的问题是,如果我使用malloc分配内存,然后使用delete删除内存块?一般的经验法则是Ifweallocatememoryusingmalloc,itshouldbedeletedusingfree.Ifweallocatememoryusingnew,itshouldbedeletedusingdelete.现在,为了检查如果我们反过来会发生什么,我写了一个小代码。#include#include#includeusingnamespacestd;classA{intp=10;public:intlol(){returnp;}};intmain()

c++ - boost scoped_lock 互斥锁崩溃

我已经保护了一个std::queue的访问函数,push、pop、size,在这些函数中使用boost::mutexes和boost::mutex::scoped_lock有时它会在作用域锁中崩溃调用栈是这样的:00x0040f005boost::detail::win32::interlocked_bit_test_and_setinclude/boost/thread/win32/thread_primitives.hpp36110x0040e879boost::detail::basic_timed_mutex::timed_lockinclude/boost/thread/wi

c++ - 为什么 const void* 没有 std::free 重载?

我使用一个externC函数返回动态分配的constchar*.我想使用unique_ptr对其进行管理。但是没有std::free(constvoid*)重载所以我得到invalidconversionfrom'constvoid*'to'void*'并且必须使用const_cast().这只是标准库的缺陷还是背后有其他原因? 最佳答案 std::free继承自C标准库。C没有重载,因此无法继承const重载。虽然C++标准库已经用一些有用的重载扩展了继承的C库,但是free还没有添加const重载。要么从未考虑过这样的过载,要么

c++ - 编写加载 msvcr80.dll 并公开 free() 函数的 DLL

我有一个依赖于MSVCR80并分配我需要清理的资源的第三方DLL。该库不公开用于执行此操作的免费函数。相反,我需要加载相同的运行时库并手动调用free函数。作为解决方法,我正在尝试编写一个“包装器”DLL,它加载正确的运行时并公开free函数。此DLL是使用VisualStudio2010创建的,并且依赖于单独的运行时库。执行LoadLibrary("msvcr80.dll")失败并出现错误R6034,我猜这是因为明显的问题。甚至可以使用LoadLibrary加载msvcr80.dll吗?我是否需要创建一个list,将其嵌入DLL并将msvcr80.dll存储在与我的包装器DLL相同的

c++ - 用于成员变量无锁更新的环形分配器?

我有一个类存储一些传入实时数据的最新值(大约1.5亿个事件/秒)。假设它看起来像这样:classDataState{Eventlatest_event;public://pusheseventatomicallyvoidpush_event(constEvent__restrict__*e);//pullseventatomicallyEventpull_event();};我需要能够以原子方式推送事件并以严格的顺序保证拉取它们。现在,我知道我可以使用自旋锁,但考虑到大量事件发生率(超过1亿/秒)和高度并发,我更愿意使用无锁操作。问题是Event大小为64字节。没有CMPXCHG64B

c++ - 使用 boost::interprocess::file_lock 创建一个锁定文件

我想使用boost::interprocess::file_lock来确保进程P1写入目录x的文件>在完成之前不会被进程P2读取。为此,我想让P1在写入文件时使用boost::interprocess::file_lock锁定文件,然后在完成后解锁它们。然后P2可以跳过(并返回)任何被锁定的文件。我遇到的问题是boost::interprocess::file_lock似乎只允许您锁定存在的文件。但是,如果我先创建文件,然后将其锁定,则会出现竞争条件:P1创建文件P2注意到文件并开始读取它P1锁定文件P1写入一些数据P2读取一些数据,到达最后,最后只有P1的部分输出。所以我想做的是创建