如果互斥锁被锁定,安全地跳过任务

     2023-02-22     108

关键词:

【中文标题】如果互斥锁被锁定,安全地跳过任务【英文标题】:Safely skip an task if mutex is locked 【发布时间】:2020-05-17 19:07:50 【问题描述】:

我正在努力解决互斥锁/锁的问题。 情况:

任务 A 需要相对较长的时间。它在一个线程中不规则地执行(但一次只执行一次)。 有一个任务 B,它很快,并且经常从另一个线程调用。 两个任务都在同一个内存上工作,因此不应同时执行。 任务 B 不等待任务 A 至关重要,因为上下文是在渲染后与 GPU 通信(纹理传输),这会导致帧延迟,因为任务 A 可能需要几个帧。 如果任务 A 当前正在运行,则应该跳过任务 B。 但决不能跳过任务 A

到目前为止我所拥有的: 任务 A 的线程(不定期调用):


  std::unique_lock<std::mutex> mlock(the_mutex);
  TaskA();

还有任务B(挂在渲染线程中)


  if mutex.try_lock()
  
    TaskB();
    the_mutex.unlock();
  

The_mutex 是对象的通用 std::mutex。

这一次真的那么容易,还是我错过了什么?在过去烦人的多线程错误之后,我对这个话题变得不安全。 非常感谢。

【问题讨论】:

抽象不是很好吗? :) 【参考方案1】:

您的代码是正确的,但为了异常安全和防止资源泄漏,您最好在任务 B 中使用 RAII。一般规则是“使用 RAII 锁守卫(lock_guard、unique_lock、shared_lock),永远不要调用 mutex.lock 和mutex.unlock 直接 (RAII)"。

std::unique_lock<std::mutex> mlock(the_mutex, std::defer_lock);
if (mlock.try_lock()) 
    TaskB();

std::unique_lock<std::mutex> mlock(the_mutex, std::try_to_lock);
if (mlock) 
    TaskB();

【讨论】:

也可以使用std::try_lock 代替std::defer_lock 然后只使用if (mlock) @AlanBirtles std::try_lock没有使用RAII,需要mutex::unlock,所以不如直接使用mutex::lock 不知道为什么你认为std::try_lockstd::defer_lock 有任何不同,如果en.cppreference.com/w/cpp/thread/unique_lock/unique_lock 有区别,那std::unique_lock 就毫无意义了 @AlanBirtles 查看en.cppreference.com/w/cpp/thread/try_lock 上的示例代码,在std::try_lock 之后需要mutex::unlockunique_lock 不是这种情况,您不需要 unlock,因为析构函数会为您执行此操作。 对不起,我的意思是try_to_lock

linux多线程中互斥锁读写锁自旋锁条件变量信号量详解

...​​原子性​​:互斥锁是一个原子操作,操作系统保证如果一个线程锁定了一个互斥锁,那么其他线程在同一时间不会成功锁定这个互斥锁​​唯一性​​:如果一个线程锁定了一个互斥锁,在它解除锁之前,其他线程不可以... 查看详情

VBA - 如何有条件地跳过for循环迭代

...上有一个for循环。我想要做的是测试循环中的某个条件,如果为真则跳到下一次迭代:Fori=LBound(Schedule,1)ToUBound(Schedule,1)If(Schedule(i,1)<Reference 查看详情

gosync包分析

...控制,goroutine机制会有大量并发情况,而数据在大并发下如果没有锁控制会导致数据无法保证安全,因此就需要用到锁机制来保证数据一致性,sync包就提供了相应的方法。互斥锁Mutex提供了两个方法Lock()和Unlock()加锁和解锁。一... 查看详情

有条件地跳过案例

】有条件地跳过案例【英文标题】:Conditionallyskipcases【发布时间】:2013-08-0701:32:02【问题描述】:在Select...Case语句中,有没有办法根据先决条件跳过案例?我现在在做什么,举一个非常愚蠢的例子:PrivateSubPrintNumbers(includeEvenNum... 查看详情

我可以有条件地跳过在同一个文件中加载“更多”红宝石代码吗?

...有条件地跳过在同一个文件中加载“更多”ruby代码吗?如果找不到库(通过require加载)?beginrequire\'aws-sdk\'rescueLoa 查看详情

如何有条件地跳过python中for循环中的迭代步骤数?

...=["a","b","XYZ","c","d","e","f","g"]我们使用for循环遍历其项目,如果项目是"X 查看详情

互斥量示例/教程? [关闭]

】互斥量示例/教程?[关闭]【英文标题】:Mutexexample/tutorial?[closed]【发布时间】:2011-06-2617:50:08【问题描述】:我是多线程的新手,并试图了解互斥锁的工作原理。做了很多谷歌搜索,但仍然对它的工作原理产生了一些疑问,因... 查看详情

POSIX 部分写入、线程安全和锁定

...安全的,它也不能保证完全写入,可能会发生部分写入。如果两个线程写入同一个文件描述符,有没有办法只阻塞文件描述符,而不是使用全局互斥锁来阻塞整个函数?因此,如果两个线程尝试写入fd1,则一个必须等​​待另一... 查看详情

在条件变量上发出信号之前是不是必须锁定互斥锁?

...动、停止和发布任务。TaskRunner将在内部创建一个线程,如果队列不为空,它将从队 查看详情

apache spark - 迭代地跳过并从 RDD 中获取

】apachespark-迭代地跳过并从RDD中获取【英文标题】:apachespark-iterativelyskipandtakefromRDD【发布时间】:2018-03-1917:04:21【问题描述】:给定一个RDD,对它进行排序然后在离散大小的块中使用它的最佳方法是什么?例如:JavaRDD<Integer&... 查看详情

rails .each 无缘无故地跳过第二个元素

】rails.each无缘无故地跳过第二个元素【英文标题】:rails.eachisskippingthesecondelementthroughfornoreason【发布时间】:2014-12-0208:09:17【问题描述】:我有以下代码:@referred_emails=Array.new@referred_emails=params.select|k,v|k.start_with?(\'referred_\').value... 查看详情

运行测试时如何优雅地跳过 express-jwt 中间件?

】运行测试时如何优雅地跳过express-jwt中间件?【英文标题】:Howtoelegantlyskipexpress-jwtmiddlewarewhenrunningtests?【发布时间】:2017-05-0323:45:35【问题描述】:这是我创建的一个小型中间件,用于在我的nodejs应用程序测试期间跳过身份... 查看详情

字符串长度的for循环奇怪地跳过了一些字符

】字符串长度的for循环奇怪地跳过了一些字符【英文标题】:forlooponStringlengthweirdlyskippingsomechars【发布时间】:2021-06-2908:53:26【问题描述】:如标题中所述,我正在从文件中读取的字符串上运行for循环,试图删除每个-字符,但... 查看详情

我们可以为所有其他调用使用 pthreads 互斥锁锁定一个函数吗?

...func1()。但是,在主应用程序的其他地方也调用了func1()。如果我只将它包装在线程中的互斥锁中,它对整个应用程序是否安全?还是必须进入并锁 查看详情

销毁全局对象[关闭]

...据之前,互斥锁会被线程锁定。一切都很好,除了删除。如果一个线程正在锁定互斥锁并删除对象。怎么又能解锁呢?(因为内存将被释放用于数据和互斥锁)如何使用这种方法实现安全删除,即将互斥体 查看详情

如何有条件地跳过 Grails Spring Security 插件过滤器链中的 SecurityContextPersistenceFilter 过滤器

】如何有条件地跳过GrailsSpringSecurity插件过滤器链中的SecurityContextPersistenceFilter过滤器【英文标题】:HowtoconditionallyskiptheSecurityContextPersistenceFilterfilterinGrailsSpringSecuritypluginfilterchain【发布时间】:2015-07-2017:04:39【问题描述】:我... 查看详情

互斥锁-pthread_mutex

...共享一个临界区(例如:共享内存空间或者全局变量),如果仅对该临界区读取,不进行内容修改,即使同时多次读取都是没有问题的。但是,当我们需要修改临界区内的内容时,我们就必须面对一个情况:同时有多个操作对临... 查看详情

多个线程试图锁定

...有任何实际代码,只是一个关于互斥锁如何工作的问题。如果我让线程1锁定了一个互斥体,然后n个其他线程尝试锁定同一个互斥体,那么当线程1解锁互斥体时会发生什么行为?如果线程1获得了锁,那么线程2尝试加锁,然后 查看详情