据我了解,如果两个或多个线程试图同时访问同一个内存块,它至少应该“抱怨”。
我正在为一个计算回文的类编写一个程序(在列表中前后出现的单词也算在内)。在我的多线程解决方案中,我生成了 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;
}
现在,应该导致程序停止的段。我修改了 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;
}
你可以看到我注释掉了一堆 sem_post/waits。