草庐IT

connectionList_mutex

全部标签

c++ - 如何 std::mutex::lock 直到函数返回

我想返回一个std::vector。此std::vector可以从其他线程访问(读和写)。如何在函数完成返回后立即解锁我的std::mutex?例如://Value.cppstd::vectorGetValue(){std::lock_guardlock(mutex);//Dosupersmartstuffhere//...returnm_value;}//MyThread.cppautovec=myVec.GetValue();现在如果“在这里做super聪明的事情”是空的怎么办://Value.cppstd::vectorGetValue(){std::lock_guardlock

c++ - pthread_mutex_lock/unlock 的性能

我注意到,当我有一个可以大量锁定和解锁线程的算法时,我的性能会受到相当大的影响。有什么办法可以帮助减少开销吗?使用信号量会提高/降低效率吗?谢谢typedefstruct_treenode{struct_treenode*leftNode;struct_treenode*rightNode;int32_tdata;pthread_mutex_tmutex;}TreeNode;pthread_mutex_t_initMutex=PTHREAD_MUTEX_INITIALIZER;int32_tinsertNode(TreeNode**_trunk,int32_tdata){TreeNod

c++ - std::mutex 顺序一致吗?

比如说,我有两个线程A和B写入全局bool变量fA和fB分别初始设置为false并受std::mutex保护对象mA和mB分别是://ThreadAmA.lock();assert(fA==false);fA=true;mA.unlock();//ThreadBmB.lock()assert(fB==false);fB=true;mB.unlock()是否可以观察到fA上的修改?和fB在不同的线程中以不同的顺序C和D?也就是说,下面的程序可以吗#include#include#include#include#includeusingnamespacestd;mutexmA,mB,cou

c++ - std::timed_mutex::try_lock* 虚假地失败

try_lock*是指try_lock()、try_lock_for()和try_lock_until()。根据cppreference,这三种方法都可能会虚假地失败。以下引用自try_lock_for()的描述Aswithtry_lock(),thisfunctionisallowedtofailspuriouslyandreturnfalseevenifthemutexwasnotlockedbyanyotherthreadatsomepointduringtimeout_duration.我知道std::condition_variable可能会发生虚假唤醒及其背后的基本原理。但

c++ - 如何最好地测试 Mutex 实现?

测试互斥量实现是否正确的最佳方法是什么?(有必要实现互斥锁,重用不是一个可行的选择)我想出的最好办法是让许多(N)个并发线程迭代地尝试访问protected区域(I)次,这会产生副作用(例如更新到全局),这样访问次数+可以统计写入次数,保证全局的更新次数正好是(N)*(I)。还有什么建议吗? 最佳答案 对于这种事情,形式化的证明比测试要好。测试会告诉您——只要您运气不错——一切都有效。但是测试是一种钝器。它可能无法执行导致失败的完全正确的序列。很难测试硬件中可用的每个可能的操作序列以确保您的互斥锁在所有情况下都能正常工作。测试并非没

C++ shared_mutex 实现

boost::shared_mutex或std::shared_mutex(C++17)可用于单个写入器、多个读取器访问。作为一项教育练习,我整理了一个使用自旋锁并具有其他限制(例如公平策略)的简单实现,但显然不打算在实际应用程序中使用。这个想法是互斥锁保持一个引用计数,如果没有线程持有锁,该引用计数为零。如果>0,则该值表示具有访问权限的读者数。如果为-1,则表示单个作者具有访问权限。这是没有数据竞争的正确实现(特别是使用的最小内存排序)吗?#includeclassmy_shared_mutex{std::atomicrefcount{0};public:voidlock()//w

c++ - 在非多线程时避免 std::mutex 的成本?

假设我有一个应用程序可能会或可能不会生成多个线程。如下所示,使用std::mutex有条件地保护需要同步的操作是否值得,或者锁是否便宜到在单线程时无关紧要?#include#includestd::atomicmore_than_one_thread_active{false};voidoperation_requiring_synchronization(){//...}voidcall_operation_requiring_synchronization(){if(more_than_one_thread_active){staticstd::mutexmutex;std::lo

c++ - std::unique_lock<std::mutex> 禁止dll卸载

我在卸载dll时遇到问题。就像this一但退出不同。我正在使用LoadLibraryA加载一个dll然后调用一个函数并用FreeLibrary关闭dll.但是,dll并没有卸载,但FreeLibrary返回成功。减少代码:voidfoo(){std::unique_locklock(mtx_);}在调试代码和查看ProcessExplorer时unique_lock创建第二个线程,但是为什么呢?此外,只要应用程序运行,该线程就会运行。没有别的了;dll没有其他句柄,没有其他功能。此外,dll仍在程序中加载。如果我删除上面的行,一切都很好。dll卸载正常,没有额外的线程。所以我的问题是,

windows - Mutex 是否调用系统调用?

CRITICAL_SECTIONlocking(enter)andunlocking(leave)areefficientbecauseCStestingisperformedinuserspacewithoutmakingthekernelsystemcallthatamutexmakes.Unlockingisperformedentirelyinuserspace,whereasReleaseMutexrequiresasystemcall.我刚刚在thisbook中读到这些句子.内核系统调用是什么意思?你能给我函数的名称吗?我是一个英语新手。我是这样解释它们的。CS测试不使用系

c++ - boost::interprocess::named_mutex 与 CreateMutex

我想从CreatMutex切换到boost::interprocess::named_mutex以将我的应用程序限制为单个实例。当应用程序正常运行和结束时,这两种方法都有效。但是,当应用程序崩溃并使用boost::interprocess::named_mutex时,锁不会被释放。我可以通过使用两个name_mutex来解决这个问题,但我真的不明白这个问题。为什么boost::interprocess::named_mutex的锁在应用程序崩溃时没有释放,但它是通过CreatMutex释放的?有什么区别?boost::interprocess::named_mutexmutex(boo