在 CentOS 系统中,使用 readdir 函数进行目录读取时,可以通过以下方法实现并发控制:
互斥锁是一种同步机制,用于确保多个线程在访问共享资源时不会发生冲突。在使用 readdir 函数时,可以在打开目录之前加锁,读取完成后解锁。这样可以确保同一时间只有一个线程在访问目录。
示例代码:
#include <pthread.h> #include <dirent.h> #include <stdio.h> pthread_mutex_t lock; void *read_directory(void *path) { pthread_mutex_lock(&lock); DIR *dir = opendir(path); struct dirent *entry; while ((entry = readdir(dir)) != NULL) { printf("%s\n", entry->d_name); } closedir(dir); pthread_mutex_unlock(&lock); return NULL; } int main() { pthread_t threads[5]; pthread_mutex_init(&lock, NULL); for (int i = 0; i < 5; ++i) { pthread_create(&threads[i], NULL, read_directory, "."); } for (int i = 0; i < 5; ++i) { pthread_join(threads[i], NULL); } pthread_mutex_destroy(&lock); return 0; } 信号量是一种计数器,用于控制多个线程对共享资源的访问。在使用 readdir 函数时,可以使用信号量来限制同时访问目录的线程数量。
示例代码:
#include <semaphore.h> #include <dirent.h> #include <stdio.h> #include <pthread.h> sem_t semaphore; void *read_directory(void *path) { sem_wait(&semaphore); DIR *dir = opendir(path); struct dirent *entry; while ((entry = readdir(dir)) != NULL) { printf("%s\n", entry->d_name); } closedir(dir); sem_post(&semaphore); return NULL; } int main() { pthread_t threads[5]; sem_init(&semaphore, 0, 2); // 允许最多2个线程同时访问目录 for (int i = 0; i < 5; ++i) { pthread_create(&threads[i], NULL, read_directory, "."); } for (int i = 0; i < 5; ++i) { pthread_join(threads[i], NULL); } sem_destroy(&semaphore); return 0; } 这两种方法都可以实现并发控制,但互斥锁适用于限制单个资源的访问,而信号量适用于限制多个资源的访问。根据实际需求选择合适的同步机制。