Objective c 如何防止访问可相互访问的变量?

Objective c 如何防止访问可相互访问的变量?,objective-c,c,multithreading,Objective C,C,Multithreading,我有一个函数,它接受一个整型指针作为参数,然后改变参数。我有几个函数实例在不同的线程上运行-一些实例与参数具有相同的整数 如果参数被另一个线程上的函数的另一个实例更改,我需要暂停函数的实例,并在另一个实例完成更改变量后恢复 对于这类问题,似乎显而易见的解决方案是使用NSLock或POSIX互斥锁,但是这会阻止函数的所有实例继续运行,即使整型参数不同 为了更直观地理解我的意思,请考虑以下内容: void theFunction (int *argument) { NSLock *th

我有一个函数,它接受一个整型指针作为参数,然后改变参数。我有几个函数实例在不同的线程上运行-一些实例与参数具有相同的整数

如果参数被另一个线程上的函数的另一个实例更改,我需要暂停函数的实例,并在另一个实例完成更改变量后恢复

对于这类问题,似乎显而易见的解决方案是使用NSLock或POSIX互斥锁,但是这会阻止函数的所有实例继续运行,即使整型参数不同

为了更直观地理解我的意思,请考虑以下内容:

void theFunction (int *argument)
{   
    NSLock *theLock = [NSLock new];
    [theLock lock];

    (*argument) ++;

    [theLock unlock];
}

上面的代码将阻止函数的所有实例运行,但是我只需要暂停整数参数相同的函数实例。如何将变量锁定为特定的,以暂停任何试图读取或写入它的实例直到它被解锁?

如果您有int *,请考虑使用原子增量操作(见OnOxICADD32上的Mon)。对每个值锁定都很便宜。

如果你有int,请考虑使用原子增量操作(见OnOxICADD32上的Mon)。按值锁定非常便宜。

为每个参数使用单独的锁?

为每个参数使用单独的锁?

这个整数变量有多少不同的值?好的,编辑使这个问题更有意义,但是
*argument++
中的运算符优先级是错误的(空格有误导性)。编辑后,我不得不删除我的答案,因为事情并不像我希望的那么简单。本地锁的问题仍然存在。基于
*参数的值而不是地址
参数
授予访问权限真的有意义吗(作为ISTM,它是指向的位置,这是值得保护的资源)?也许,您应该在此处提供更多上下文。是的,需要更多上下文。是否可以包装integer对象,以便函数接受指向(对象,锁)的指针元组?这个操作是不是可以通过原子操作来完成?等等。这个整数变量有多少个不同的值?好的,编辑使这个问题更有意义,但是
*argument++
中的运算符优先级是错误的(空格是误导性的)。编辑后,我不得不删除我的答案,因为事情并不像我希望的那样简单。本地锁的问题仍然存在。基于
*参数
的值而不是地址
参数
(因为ISTM是指向的位置,这是值得保护的资源)授予访问权限真的有意义吗?也许,您应该在这里提供更多的上下文。是的,需要更多的上下文。包装integer对象以便函数接受指向(对象、锁)元组的指针可以吗?操作是否可以通过原子操作完成?等等。