相关疑难解决方法(0)

锁定对象不被多个线程访问 - Objective-C

我对Objective-C中的线程安全性有疑问.我已经阅读了其他几个答案,一些Apple文档,但仍然对此有一些疑问,所以我想问我自己的问题.

我的问题有三个:

假设我有一个数组, NSMutableArray *myAwesomeArray;

折叠1:

现在纠正我,如果我错了,但从我的理解,使用@synchronized(myAwesomeArray){...}将阻止两个线程访问相同的代码块.所以,基本上,如果我有类似的东西:

-(void)doSomething {
    @synchronized(myAwesomeArray) {
        //some read/write operation on myAwesomeArray
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,如果两个线程访问相同的方法相同的时间,代码块将是线程安全的.我猜我已经理解了这一部分.

折叠2:

如果myAwesomeArray被不同方法的多个线程访问,我该怎么办?如果我有类似的东西:

- (void)readFromArrayAccessedByThreadOne {
    //thread 1 reads from myAwesomeArray
}

- (void)writeToArrayAccessedByThreadTwo {
    //thread 2 writes to myAwesomeArray
}
Run Code Online (Sandbox Code Playgroud)

现在,两个方法同时由两个不同的线程访问.我如何确保myAwesomeArray不会出现问题?我是否使用类似NSLock或NSRecursiveLock的东西?

折3:

现在,在上面的两个案例中,myAwesomeArray是一个内存中的iVar.如果我有一个数据库文件,我并不总是留在内存中怎么办?databaseManagerInstance每当我想执行数据库操作时,我都会创建一个,并在完成后释放它.因此,基本上,不同的类可以访问数据库.每个类都创建自己的实例DatabaseManger,但基本上,它们都使用相同的单个数据库文件.在这种情况下,如何确保数据不会因竞争条件而损坏?

这将帮助我清除一些基本原理.

multithreading objective-c ios

36
推荐指数
2
解决办法
3万
查看次数

@synchronized是否保证线程安全?

参考这个答案,我想知道这是对的吗?

@synchronized不会使任何代码"线程安全"

当我试图找到支持此声明的任何文档或链接时,没有成功.

任何评论和/或答案将在此受到赞赏.

为了更好的螺纹安全性,我们可以使用其他工具,这对我来说是已知的.

macos cocoa objective-c synchronized ios

30
推荐指数
3
解决办法
3万
查看次数

哪个是线程安全的原子或非原子?

我搜索并发现不可变是线程安全而可变不是.这可以.但是我得到了误导性的注释,博客,关于线程安全的原子与非原子的答案,请给出答案的解释.

假设有一个名为"name"的原子字符串属性,如果[self setName:@"A"]从线程A调用,[self setName:@"B"]从线程B调用,并[self name]从线程C 调用,则不同线程上的所有操作将串行执行,这意味着如果一个线程正在执行setter或getter,然后其他线程将等待.这使得属性"name"读/写安全,但如果另一个线程D [name release]同时调用,则此操作可能会导致崩溃,因为此处不涉及setter/getter调用.这意味着对象是读/写安全(ATOMIC)但不是线程安全的,因为另一个线程可以同时向对象发送任何类型的消息.

如果属性"name"是非原子的,那么上面例子中的所有线程--A,B,C和D将同时执行,产生任何不可预测的结果.在原子的情况下,A,B或C中的任何一个将首先执行,但D仍然可以并行执行.

你对此的评论将有助于我们......

而我的问题是,"这在可可,原子或非原子中是线程安全的吗?"

cocoa multithreading atomic objective-c thread-safety

29
推荐指数
3
解决办法
2万
查看次数