在Linux中,readdir
函数用于读取目录中的文件和子目录。要实现并发控制,可以使用互斥锁(mutex)或其他同步原语来确保多个线程或进程在访问目录时不会发生冲突。
以下是一个使用互斥锁实现并发控制的简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <pthread.h>
pthread_mutex_t lock;
void *read_directory(void *path) {
DIR *dir;
struct dirent *entry;
pthread_mutex_lock(&lock); // 加锁
dir = opendir((char *)path);
if (dir == NULL) {
perror("opendir");
pthread_mutex_unlock(&lock); // 解锁
return NULL;
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
pthread_mutex_unlock(&lock); // 解锁
return NULL;
}
int main(int argc, char *argv[]) {
pthread_t threads[5];
int i;
if (argc != 2) {
fprintf(stderr, "Usage: %s <directory_path>\n", argv[0]);
return 1;
}
pthread_mutex_init(&lock, NULL);
for (i = 0; i < 5; ++i) {
if (pthread_create(&threads[i], NULL, read_directory, (void *)argv[1]) != 0) {
perror("pthread_create");
exit(1);
}
}
for (i = 0; i < 5; ++i) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&lock);
return 0;
}
在这个示例中,我们使用pthread_mutex_t
类型的互斥锁lock
来保护对目录的访问。在read_directory
函数中,我们在打开目录之前锁定互斥锁,并在关闭目录之后解锁。这样可以确保在同一时间只有一个线程可以访问目录,从而实现并发控制。
需要注意的是,这个示例中的并发控制是粗粒度的,因为每个线程在读取整个目录时都会持有锁。在实际应用中,可以根据需要使用更细粒度的同步原语,例如读写锁(pthread_rwlock_t
),以允许多个线程同时读取目录,但在写入时仍然需要互斥访问。