整数数组在堆栈上分配,并从两个不同的线程写入。
对于holder []的访问是否在以下代码中是线程安全的?
void some_function() {
NSUInteger holder[256] = {0};
NSUInteger *ptr_holder = holder;
void (^countBlock)(<...>)= ^(<...>) {
for (<...>) {
++ptr_holder[counter];
}
dispatch_semaphore_signal(sema);
};
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
countBlock(<...>);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
countBlock(<...>);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
//Performing some work on holder[] from this point
}
如果它不是线程安全的设计那么为什么以及如何改进呢?
答案 0 :(得分:0)
分配数组内存的位置并不重要。如果至少有一个编写器,那么读取原始内存本身就不是线程安全的。显然,如果有多个编写器,它们之间也没有线程安全性。 (读取单个位置可能是原子的,但这与线程安全不同。)
P.S。您的示例代码没有显示对T
的任何书写。