我编写了一个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;
}
}
编辑: 我认为,直到所有线程完成他们的工作,没有新的文件读取。这是真的吗?
答案 0 :(得分:0)
我认为您的问题是单一缓冲区:
buf[BUFSIZE];
在每个循环中,您将数据读入该缓冲区,然后为线程
准备数据thr_data[i].msg = buf;
我假设不包含缓冲区本身的副本。我认为msg
只是一个指针。
因此,在下一次迭代中,您将使用文件中的新数据覆盖buf
,从而更改已创建线程的数据。
我想你需要
buf[NUM_THREADS][BUFSIZE];
这样每个线程都可以获得自己的数据区域。
引用:
我认为,直到所有线程完成他们的工作,没有新的文件读取。这是真的吗?
正确,这就是pthread_join
为你做的事情