草庐IT

c++ - 访问共享内存进行读取时锁定

如果我以只读方式访问共享内存,以检查if()block的条件,我是否仍应锁定互斥体?例如mutex_lock();if(var/*sharedmemory*/){}mutex_unlock();是否需要在此处锁定以及良好做法? 最佳答案 如果您正在读取的变量可以并发写入,那么是的,您应该获取互斥锁。如果您的编译器为您提供必要的原语,您只能原子地读取它;这可能是C11和C++11附带的原子功能,也可能是您的编译器提供的其他语言扩展。然后您可以将互斥量获取移到条件中,但是如果您等到测试之后才获取互斥量,那么其他人可能会在您测试它和获取互

C++ std lib <mutex>, <conditional_variable> 库和共享内存

如果您想在共享内存中的进程之间共享互斥体,POSIX线程的CAPI需要设置一个特殊标志-请参阅sem_init()。我真的不知道差异是什么,但我在尝试在共享内存中使用C++std::condition_variable时遇到了问题——它的段错误。我在C++文档或构造函数中看不到任何提及此内容的内容。我想知道如何/是否可以在共享内存中使用C++线程互斥锁。这是我的测试代码供引用。注意squeue只是一个简单的(POD)静态大小的循环队列,省略了不相关的内容:#include#include#include/*Formodeconstants*/#include/*ForO_*consta

c++ - std::atomic 用于内置类型 - 非无锁与琐碎的析构函数?

查看std::atomic这是我阅读的默认专业:Thesespecializationshavestandardlayout,trivialdefaultconstructors,andtrivialdestructors.我还阅读了is_lock_free:Allatomictypesexceptforstd::atomic_flagmaybeimplementedusingmutexesorotherlockingoperations,ratherthanusingthelock-freeatomicCPUinstructions.Atomictypesarealsoallowed

c++ - C++ 线程安全对象缓存的设计选项

我正在用C++编写一个用于数据缓存的模板库,其中可以进行并发读取和并发写入,但不是针对同一个键。该模式可以用以下环境来解释:用于缓存写入的互斥锁。缓存中每个键的互斥量。这样,如果线程从缓存中请求一个键但不存在,则可以为该唯一键启动锁定计算。与此同时,其他线程可以检索或计算其他键的数据,但试图访问第一个键的线程会被锁定等待。主要的约束是:永远不要同时计算一个键的值。可以同时计算2个不同键的值。数据检索不得锁定其他线程以防止从其他键检索数据。我的其他限制但已经解决的是:固定(在编译时已知)基于MRU(最近使用的)抖动的最大缓存大小。通过引用检索(暗示互斥共享计数)我不确定为每个键使用1个互

c++ - 是否有必要锁定 STL 容器以读取其数据?

我正在编写一个多线程服务器,其中包含5或6个全局数据结构(映射、vector等),并且我正在尝试确定是否需要为某些数据保留互斥锁以便从映射中读取值或vector,或者仅当我要更改数据/添加新项目时才需要持有互斥体。 最佳答案 如果多个线程正在访问容器并且至少有一个线程正在修改容器的内容,则您需要同步对容器的访问。如果没有任何线程修改过容器的内容,则不需要同步对它的访问。[请注意,C++语言标准没有提到线程(至少现在还没有),因此根本不需要容器可以从多个线程使用。也就是说,我上面所说的至少对于标准库的所有主要实现都是正确的,并且是即将

c++ - 在线程编程中保护简单列表?

我正在阅读一本POSIX线程书籍以进行一些练习,并且我试图找出在一个简单的单链表中我需要互斥保护的地方作为一个小练习题。例如,如果我有一个节点结构列表:templatestructNode{Node*next;Tdata;};Node*head=NULL;//Populateliststartingathead...[HEAD]-->[NEXT]-->[NEXT]-->[NEXT]-->[...]-->[NULL]我有两个或更多线程。任何线程都可以在列表中的任何位置插入、删除或读取。似乎如果你只是试图保护单个列表元素(而不是整个列表),你永远不能保证另一个线程不会修改下一个*指针指向的

c++ - Win32 CMutex 与标准库 std::mutex 的比较

自从引入threadC++11中的库,我一直在检查我的代码并进行一些更改,以将其从特定于平台的多线程代码转移到可移植的标准库代码。但是,我很好奇标准库之间是否存在性能或功能差异std::mutex和std::lock_guard和Win32特定的CMutex和CSingleLock.我没有分析多线程代码的经验,而且我不知道这两个互斥锁类中任何一个的内部结构,所以我什至无法冒险猜测。 最佳答案 功能性尊重是肯定的--CMutexstd::mutex直接映射到Win32互斥类型更基本,可能使用win32CRITICAL_SECTION实

c++ - std::function 在调用内部可变 lambda 时是否锁定互斥量?

除非另有说明,否则C++标准库对其类型提供以下保证:(1)读取操作(即处理const对象)是线程安全的。这意味着只要没有线程同时写入(应用非const操作)对象,多个线程就可以同时从对象读取而不会出现竞争条件。(2)多个线程可以同时读写任意对象,只要每个对象一次最多只能被一个线程访问。标准库需要用户类型的相同保证。(您可以在GotW#95中阅读这些内容或观看HerbatC++andBeyond2012对此的解释。)现在我的问题是,如果下面的结论是正确的:因为std::function的operator()是一个const成员函数,它需要是线程安全的。如果在构造时传入的仿函数有一个con

c++ - 互斥量和信号量之间的区别 - 进程内和进程间

阅读关于两者(互斥量和信号量)之间差异的各种帖子,我得出以下结论,如果我错了请纠正我。这主要与Windows有关。我知道关键部分是代码中需要保护的部分(即)不能同时被多个线程访问。现在为了保护那些关键部分,使用了Mutexes。这些互斥量可以是算法或数据结构。现在互斥通常有两种形式(进程内和进程间)。对于没有调用内核进行锁定的内部进程,我们可以使用BoostThreadsynchronizationprimitives例如lock_guard,unique_lock,shared_lock(单作者/多读者)和进程间我们可以使用BoostInterprocesssemaphore.现在这

c++ - enable_if 和互斥方法

我不明白为什么下面的代码不起作用。编译器(gcc)似乎同时实例化了两者方法,显然整数是有符号或无符号的,所以总是失败。我虽然enable_if在这里是为了避免这种情况。问:为什么编译出错,如何避免?usingnamespaceboost;//orstdasyouwanttemplatestructtest{//ifsignedtemplate,int>::type=0>test&operator,int>::type=0>test&operatorx;xetc.testy;yetc.} 最佳答案 SFINAE仅适用于immediat