C并发阵列分配和免费

时间:2016-11-02 09:40:53

标签: c multithreading pointers

我正在使用array 2个帖子。一个是写它和另一个阅读。你可以假设阅读比写作慢。读者和作者是分开的pthreads。据我所知,在这些线程之间共享array作为全局变量是安全的。 所以整体情况如下:

char ** array;

void writer(void){
    for (unsigned long i = 0; i < maxArraySize; i++){
     array[i] = malloc(someSize);
     array[i] = someCharArray;
}

void reader(void){
    for (unsigned long i = 0; i < maxArraySize; i++){
     if(array[i] == NULL){ // in case reader is faster
      i--;
      continue;
    }
     useData(array[i]);
    free(array[i]);      // HERE IS MY QUESTION..
}


main(){
    array  = malloc(maxArraySize);   
    pthread_t reader, writer;
    pthread_create( &reader, NULL, reader, NULL);
    pthread_create( &writer, NULL, writer, NULL);
}

我的问题与我释放第一个数组元素的行有关。这样做是否安全?因为当我释放第i个元素时,同时写入是写入数组。因此可能会出现写入器错误地址的情况,因为它会丢失头指针吗?

1 个答案:

答案 0 :(得分:3)

如果在没有特殊指令的情况下读取期间读取结果未定义,则不安全。您可以获得任何值,但您不太可能看到除NULL或已分配的任何值。

正如其他人在评论中提到的那样,未初始化的数组可能包含任何内容(它是未定义的),尽管它可能在内核提供给你之前归零。

如果您需要安全性,则需要锁定机制,例如信号量(http://man7.org/linux/man-pages/man3/sem_init.3.html)。

char ** array;
// Allows access while non zero
sem_t sem;

void writer(void){
    for (unsigned long i = 0; i < maxArraySize; i++){
     array[i] = malloc(someSize);
     array[i] = someCharArray;
     // Increment semaphore.
     sem_post(&sem);
}

void reader(void){
    for (unsigned long i = 0; i < maxArraySize; i++){
     // Will return -1 if the semaphore is not at zero
     // Will return 0 if semaphore is greater than zero and decrement it.
     if(sem_trywait(&sem)){ // in case reader is faster
      i--;
      continue;
    }
    useData(array[i]);
    free(array[i]);      // HERE IS MY QUESTION..
}


main(){
    // Initialize semaphore to zero
    sem_init(&sem, 0 , 0);
    // Initialize array to have maxArraySize elements.
    array  = malloc(maxArraySize * sizeof(*array));   
    pthread_t reader, writer;
    pthread_create( &reader, NULL, reader, NULL);
    pthread_create( &writer, NULL, writer, NULL);
}

这应该很快,但会在sem_trywait处旋转你的cpu做很多事情。如果您可以再等一会儿并且不需要旋转,请使用sem_wait

我还更正了malloc语句中的错误,因为它没有为maxArraySize char *个项目分配足够的空间。