是否对GCD中的堆栈变量数组进行读写?

时间:2015-09-21 15:02:10

标签: objective-c multithreading thread-safety objective-c-blocks grand-central-dispatch

整数数组在堆栈上分配,并从两个不同的线程写入。

对于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
}

如果它不是线程安全的设计那么为什么以及如何改进呢?

1 个答案:

答案 0 :(得分:0)

分配数组内存的位置并不重要。如果至少有一个编写器,那么读取原始内存本身就不是线程安全的。显然,如果有多个编写器,它们之间也没有线程安全性。 (读取单个位置可能是原子的,但这与线程安全不同。)

P.S。您的示例代码没有显示对T的任何书写。