多线程和读取文件

时间:2016-01-12 08:24:55

标签: c multithreading file

我编写了一个C代码,它使用多线程函数读取文件并对其进行一些操作。我在fun1中读取文件,所以我希望该文件线性读取,但我对此代码进行的一些测试表明,该文件似乎没有以正确的顺序读取。我的代码有什么问题?!

#include <pthread.h>

#define BUFSIZE 1024*10
#define NUM_THREADS 4

typedef struct _thread_data_t {
  unsigned char id;
  char *msg;
  unsigned int msg_len;
} thread_data_t;

/* thread function */
void *thr_func(void *arg) {
  thread_data_t *data = (thread_data_t *)arg;
  fun2(data->msg, data->msg_len);
  pthread_exit(NULL);
}

void fun1(FILE *file) {
    unsigned char i, j, buf[BUFSIZE];
        pthread_t thr[NUM_THREADS];
        thread_data_t thr_data[NUM_THREADS];
        int rc, fr, fd = fileno(file);               
        for (;;) {
            for (i = 0; i < NUM_THREADS; i++) {
                fr = read(fd, buf, BUFSIZE);
                if (fr <= 0) break;
                thr_data[i].id = i;
                thr_data[i].msg = buf;
                thr_data[i].msg_len = fr;
                if ((rc = pthread_create(&thr[i], NULL, thr_func, &thr_data[i]))) {
                    fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
                    fr = -1;
                    break;
                }
            }    
            for (j = 0; j < i; j++) {
                pthread_join(thr[j], NULL);
            } 

            if (fr <= 0) break;
        }

}

编辑: 我认为,直到所有线程完成他们的工作,没有新的文件读取。这是真的吗?

1 个答案:

答案 0 :(得分:0)

我认为您的问题是单一缓冲区:

buf[BUFSIZE];

在每个循环中,您将数据读入该缓冲区,然后为线程

准备数据
thr_data[i].msg = buf;
我假设

不包含缓冲区本身的副本。我认为msg只是一个指针。

因此,在下一次迭代中,您将使用文件中的新数据覆盖buf,从而更改已创建线程的数据。

我想你需要

buf[NUM_THREADS][BUFSIZE];

这样每个线程都可以获得自己的数据区域。

引用:

  

我认为,直到所有线程完成他们的工作,没有新的文件读取。这是真的吗?

正确,这就是pthread_join为你做的事情