我正在尝试编写一个程序,它可以通过线程获取输入文件并将包含的项打印到屏幕中。但是,最后一个线程不会意外输出任何输出。我无法弄清楚问题所在。我在等你的帮助。Pthread在C中意外执行
每个线程获取3个参数:inputFile1,inputFile2和targetBuf(可以说它是序列号。)文件被排序,我只是简单地尝试按顺序打印它们的联合。只打印正数。
命令行:合并N outfile file1 file2 file3 .... fileN N是输入文件的数量。
如果我给2个输入文件(意味着1线程),它的工作原理。如果我给4个文件,然后第一个线程给出输出,第二个不是。如果我给6个输入文件,那么第1和第2个线程会给出输出,但是第3个不会。
头文件中有两个结构体。我把它们粘贴在下面。
//thread information
struct threadInfo{
pthread_t tid;
pthread_attr_t attr;
};
//Beginning thread input
struct beginThreadInput{
FILE **inputFile1, **inputFile2;
int targetBuf;
};
typedef struct threadInfo THREADINFO;
typedef struct beginThreadInput BEGINT_INPUT;
主要文件代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h> //for O_ constants
#include <sys/stat.h>
#include <pthread.h> /* thread library */
#include "merge.h"
int main(int argc, char** argv){
int i, k, N;
/***FILE INITIALIZATION***/
FILE *output;
N = atoi(argv[1]);
output = fopen(argv[2], "w");
FILE **inputFileList = ((FILE**)malloc (N * sizeof(FILE*)));
printf("int N is %d\n", N);
for(i = 0; i<N; i++){
inputFileList[i] = fopen(argv[i + 3], "r");
}
//START THREADS
BEGINT_INPUT **threadInputList = ((BEGINT_INPUT**) malloc ((N/2)* sizeof(BEGINT_INPUT*)));
THREADINFO **threadInfoList = ((THREADINFO**) malloc ((N/2) * sizeof(THREADINFO*)));
for(i = 0; i< N/2 ; i++){
threadInputList[i] = (BEGINT_INPUT *) malloc (sizeof(BEGINT_INPUT));
threadInfoList[i] = (THREADINFO *) malloc (sizeof(THREADINFO));
}
pthread_t tid;
pthread_attr_t attr;
for(i = 0, k = 0; i < (N/2); i++){
threadInputList[i]->inputFile1 = &(inputFileList[k]);
threadInputList[i]->inputFile2 = &(inputFileList[++k]);
threadInputList[i]->targetBuf = i;
pthread_attr_init(&(threadInfoList[i]->attr));
pthread_create(&(threadInfoList[i]->tid), &(threadInfoList[i]->attr), runBeginningThreads, (void*)threadInputList[i]);
}
pthread_join((threadInfoList[[(N/2)-1]]->tid), NULL);
for(i = 0; i<N; i++){
fclose(inputFileList[i]);
}
}
void *runBeginningThreads(void *input){
BEGINT_INPUT *myInput = (BEGINT_INPUT *)input;
int first = -1, second = -1, iseof;
printf("Thread number %d\n", myInput->targetBuf);
while((second > -2) && (first > -2)){
//read integer values from files
if(first == -1){
iseof = fscanf(*(myInput->inputFile1), "%d", &first);
if(iseof == EOF){
first = -2; //means end of file
}
else if(first < 0)
first = -1; //means waiting for an integer
}
if(second == -1){
iseof = fscanf(*(myInput->inputFile2), "%d", &second);
if(iseof == EOF){
second = -2;
}
else if(second < 0)
second = -1;
}
//print smaller one
if((first != -1) && (second != -1)){
if(((first < second) || (second == -2)) && (first != -2)){
printf("%d\n", first);
first = -1;
}
else if(second != -2){
printf("%d\n", second);
second = -1;
}
}
}
}
你是对的。但它不像你所说的,因为我等待最后一个线程,最后一个线程没有给出任何输出。如果我等待所有线程,这种情况不会改变,我已经尝试过了。如果我们说我们有N个线程,那么第一个N-1就可以正常工作。有问题的是最后一个。 – Shnkc 2012-03-30 22:37:30
@Shnkc您不能等待您认为是“最后一个”线程,因为它们的运行顺序可能不是它们的创建顺序。请记住,线程是彼此独立运行的。 – 2012-03-30 22:43:14
Ok Joachim Pileborg。我明白了。正如您所说,我正在编辑上面的发布代码。但同样的问题仍然存在。我希望我能以正确的方式解决它。 – Shnkc 2012-03-30 22:50:59