Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用多线程读取文件_C_Multithreading_Pthreads_Mutex_Fgets - Fatal编程技术网

C 使用多线程读取文件

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

我想检查一个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
        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个字节锁定一次实际上会使应用程序比完全避免多线程慢得多