为什么这个多线程程序工作(而不是崩溃)?

Tyl*_*ian 3 c multithreading pthreads

根据我的理解,如果两个或多个线程同时尝试访问同一个内存块,它应该"抱怨",至少可以说.

我正在为一个计算回文的课程编写一个程序(在列表中出现向后和向前的单词也算在内).在我的多线程解决方案中,我生成了26个线程来处理字母表中的每个字母

int error = pthread_create(&threads[i], NULL, computePalindromes, args);

计算回文只是贯穿单词子列表:

void * computePalindromes(void * arguments) {
    struct arg_struct *args = (struct arg_struct *)arguments;
    int i;

    for (i = args->start; i < args->end; i++) {
        if (quickFind(getReverse(array[i]), 0, size - 1)) {
            printf("%s\n", array[i]);
        }
    }

    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

现在,应该导致程序停止的段.我修改了quickSelect来查找列表中的反向字.

int quickFind(char * string, int lower_bound, int upper_bound) {
    int index = ((upper_bound + lower_bound) / 2);
    //sem_wait(&semaphores[index]);
    if (upper_bound <= lower_bound) return (strcmp(string, array[index]) == 0);

    if (strcmp(string, array[index]) > 0) {
        //sem_post(&semaphores[index]);
        return quickFind(string, (index + 1), upper_bound);
    } else if (strcmp(string, array[index]) < 0) {
        //sem_post(&semaphores[index]);
        return quickFind(string, lower_bound, (index - 1)); 
    } else return 1;
}
Run Code Online (Sandbox Code Playgroud)

你可以看到我注释掉了一堆sem_post/wait.

tem*_*def 5

两个线程同时访问同一个内存没有任何问题,只要它们只读取内存而不是写入内存.您对数据执行的操作都没有实际修改它,因此线程并行执行所有这些操作是完全安全的.

希望这可以帮助!

  • 欢迎来到C,你可以做任何你想做的事情,我们喜欢这样. (9认同)