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.
两个线程同时访问同一个内存没有任何问题,只要它们只读取内存而不是写入内存.您对数据执行的操作都没有实际修改它,因此线程并行执行所有这些操作是完全安全的.
希望这可以帮助!