C 使用多线程读取文件
我想检查一个IP列表,如果他们是黑名单(使用多线程) 因此,我有以下代码:C 使用多线程读取文件,c,multithreading,pthreads,mutex,fgets,C,Multithreading,Pthreads,Mutex,Fgets,我想检查一个IP列表,如果他们是黑名单(使用多线程) 因此,我有以下代码: pthread_mutex_t input_queue; void * process(void * data) { unsigned long ip = 0xffffffff; char line[20]; while (!feof(INFILE)) { pthread_mutex_lock(&input_queue);//?required i
pthread_mutex_t input_queue;
void * process(void * data)
{
unsigned long ip = 0xffffffff;
char line[20];
while (!feof(INFILE))
{
pthread_mutex_lock(&input_queue);//?required
if (fgets(line,sizeof(line),INFILE) != NULL)
{
if (strlen(line) < 8)
break;
if (line[strlen (line) - 1] == '\n')
line[strlen (line) - 1] = '\0';
ip = ntohl((unsigned long)inet_addr(line));
}
pthread_mutex_unlock(&input_queue);
blacklist(ip);
}
return NULL;
}
//in main()
pthread_mutex_init(&input_queue,NULL);
for(i = 0 ; i < number_thread; i++)
{
if(pthread_create(&thread_id[i],NULL,&process,NULL) != 0)
{
i--;
fprintf(stderr,RED "\nError in creating thread\n" NONE);
}
}
for(i = 0 ; i < number_thread; i++)
if(pthread_join(thread_id[i],NULL) != 0)
{
fprintf(stderr,RED "\nError in joining thread\n" NONE);
}
pthread\u mutex\u t输入队列;
作废*处理(作废*数据)
{
无符号长ip=0xFFFFFF;
字符行[20];
而(!feof(infle))
{
pthread_mutex_lock(&input_queue);/?必需
如果(fgets(行,sizeof(行),infle)!=NULL)
{
if(strlen(line)<8)
打破
如果(行[strlen(行)-1]=='\n')
行[strlen(行)-1]='\0';
ip=ntohl((无符号长)inet_addr(行));
}
pthread_mutex_unlock(&input_queue);
黑名单(ip);
}
返回NULL;
}
//大体上
pthread_mutex_init(&input_queue,NULL);
对于(i=0;i
pthread_mutex_lock是必需的还是fgets是线程安全的?我觉得我的代码有一些问题。C.99不支持线程,因此可移植性要求锁到位。但是,C.11对文件操作提供线程安全保证(C.11§7.21.2¨7): 每个流都有一个关联的锁,用于防止多个流发生数据争用 执行线程访问流,并限制流操作的交错 由多个线程执行。一次只能有一个线程持有此锁。锁坏了 可重入:单个线程可能在给定时间多次持有锁
在实现方面,如果文件不是很大,您可能会发现一次读取整个文件,然后为线程分配输入会更有效。但是,根据我的建议,足够大的文件将导致序列化I/O成为瓶颈。在这一点上,我可能会考虑输入的替代文件表示,例如二进制文件格式,并使用异步I/O并从文件中的多个点并行读取。
C.99不是线程感知的,因此便携性要求锁定。但是,C.11对文件操作提供线程安全保证(C.11§7.21.2¨7):
每个流都有一个关联的锁,用于防止多个流发生数据争用 执行线程访问流,并限制流操作的交错 由多个线程执行。一次只能有一个线程持有此锁。锁坏了 可重入:单个线程可能在给定时间多次持有锁在实现方面,如果文件不是很大,您可能会发现一次读取整个文件,然后为线程分配输入会更有效。但是,根据我的建议,足够大的文件将导致序列化I/O成为瓶颈。在这一点上,我可能会考虑输入的替代文件表示,如二进制文件格式,并使用异步I/O并从文件中的多个点并行读取。
您不需要这些文件。POSIX保证每个
文件对象都是线程安全的。见:
引用(文件*
)对象的所有函数的行为应与
在内部使用flockfile()
和funlockfile()
获取
这些(文件*
)对象
除非黑名单(ip)
是计算密集型的,否则每10个字节锁定一次实际上会使应用程序比完全避免多线程慢得多。您不需要这些。POSIX保证每个文件对象都是线程安全的。见:
引用(文件*
)对象的所有函数的行为应与
在内部使用flockfile()
和funlockfile()
获取
这些(文件*
)对象
除非黑名单(ip)
是计算密集型的,否则每10个字节锁定一次实际上会使应用程序比完全避免多线程慢得多