Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 背景线程的睡眠或信号量_Objective C_Multithreading_Semaphore_Objective C++_Thread Sleep - Fatal编程技术网

Objective c 背景线程的睡眠或信号量

Objective c 背景线程的睡眠或信号量,objective-c,multithreading,semaphore,objective-c++,thread-sleep,Objective C,Multithreading,Semaphore,Objective C++,Thread Sleep,我有第三方代码,它创建了很多线程,代码如下: while (true) { { my::Lock lock(&mMutex); // mutex implementation in c++ if (!reseting) { // some code break; } } usleep(1000 / 20); // 20 time per second } 我可以用信号

我有第三方代码,它创建了很多线程,代码如下:

while (true) {
    {
        my::Lock lock(&mMutex); // mutex implementation in c++
        if (!reseting) {
            // some code
            break;
        }
    }
    usleep(1000 / 20); // 20 time per second
}
我可以用
信号量
重写这段代码。使用什么,
信号灯
睡眠
?据我所知,它们的工作原理是一样的<代码>信号量将工作得更快一些,因为当
重置
发生更改时,我们可以立即继续执行此
线程

或者你有另一个更好的办法


my::Lock的实现

Lock::Lock(pthread_mutex_t *mutex) {
    _mutex = mutex;
    pthread_mutex_lock(_mutex);
}

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

你是对的,轮询是一种低效的方法。这种互斥锁实现只会让情况变得更糟

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

  • “completion handler”模式,其中API调用采用块参数,该块参数是异步任务完成时将调用的代码块。当您需要一个简单的接口来通知调用方异步任务的完成时,这是理想的

  • “”模式,其中API将有一个
    delegate
    属性来指定通知谁,以及一个协议,该协议定义了
    delegate
    可以或必须实现的方法。这是一种有用的模式,用于通信更新的接口更加复杂(例如,不仅仅是在任务完成时,还可能是各种进度更新)

  • “通知”模式(使用
    NSNotificationCenter
    通知其他对象状态更改)。如果可能有多个对象需要通知任务的完成情况,这将非常有用


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

my::Lock
在释放时解锁互斥锁。此对象在
usleep
之前发布。后台的这个过程有时会使用睡眠代码进行大量计算,所以我相信当睡眠被调用时,处理器仍然工作,但在另一个线程上。啊,释放时重新解锁,这是有意义的。这就解释了神秘的
{
作用域。我不确定另一个线程如何使用同一个锁(因为我假设该锁的目的是同步
重置
)。即使这不是问题,我也不喜欢这种隐式解锁模式。但所有这些都没有意义,因为更广泛的问题是轮询,(忽略使用互斥锁的事实!)每秒20次,效率很低。使用委托、完成块、通知或其他主动进程会更好。如果可能,请避免旋转/等待。此代码针对不同的体系结构编写。我如何知道使用睡眠是不好的做法。如果我用“完成处理程序”重写所有代码,我会获得更高的应用程序性能例如模式。现在创建了4-5个线程,其中需要进行大量计算。当一个线程处于睡眠状态时,处理器在另一个线程中进行计算。此外,如果我重写到某个模式,代码的可读性将降低。是的,轮询和
usleep
不是很好,但是使用信号量通常也不是很好,依情况而定。但是,从从实际的角度来看,很有可能对这段代码进行更重要的重构并不值得付出努力,因为所获得的收益可能并不多。事实上,这一切都有过早优化的味道。