gpt4 book ai didi

objective-c - 后台线程的 sleep 或信号量

转载 作者:行者123 更新时间:2023-12-03 13:04:39 25 4
gpt4 key购买 nike

我有第三方代码,它使用这样的代码创建了很多线程:

while (true) {
{
my::Lock lock(&mMutex); // mutex implementation in c++
if (!reseting) {
// some code
break;
}
}
usleep(1000 / 20); // 20 time per second
}

我可以用 semaphore 重写这段代码.用什么, semaphoresleep ?据我了解,它们的工作方式相同。 Semaphore工作会快一点,因为我们可以立即继续 threadreset被改变。

或者也许你有另一个想法如何更好地做到这一点?
my::Lock的实现:
Lock::Lock(pthread_mutex_t *mutex) {
_mutex = mutex;
pthread_mutex_lock(_mutex);
}

Lock::~Lock() {
pthread_mutex_unlock(_mutex);
}

最佳答案

您是正确的,轮询是一种低效的方法。这种互斥锁实现只会使情况变得更糟。

你问信号量是否可能是更好的模式:它可能是,但我怀疑你可以做得更好。具体来说,我想到了三种异步模式:

  • “完成处理程序”模式,其中 API 调用采用 block 参数,该参数是异步任务完成时将调用的代码块。当您需要一个简单的接口(interface)来通知调用者异步任务的完成时,这是理想的选择。
  • delegate-protocol ”模式,其中 API 将具有 delegate属性来指定通知谁和​​定义delegate的方法的协议(protocol)可能或必须实现。这是一种有用的模式,用于通信更新的接口(interface)更复杂(例如,不仅是在任务完成时,还可能是各种进度更新)。
  • “通知”模式(使用 NSNotificationCenter 通知其他对象状态更改)。如果有可能不止一个对象想要获知任务的完成,这将很有用。

  • 坦率地说,选择可能取决于这个第三方库的细节。很难根据提供的信息进行评估。

    关于objective-c - 后台线程的 sleep 或信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30374206/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com