Pthread同步:两个文本文件的返回和读取

我正在编写一个创建两个线程的程序。 每个线程负责读取一个文本文件,每行有一个字符。

第一种格式如下:

h 0 h 0 ... 

第二个格式如下:

 0 i 0 i 0 i 

有时可能会有多个字母在彼此之后,或者在彼此之后有多个零。 但是,可以肯定的是,如果一个文件的一行上有一个字母,则第二个文件的相应行将为0,反之亦然。

线程应该继续将文件输入读入全局char数组,直到它们达到零。 此时,他们允许其他线程接管。 他们一直来回走,直到两个文件完全被读取。

在这一点上,当我跑步的时候,我得到的变化是:(1)很多h后跟很多我或(2)( 正确答案 )连续的hihihi流,或者(3)有时很多我跟着很多h。 所以,我知道我的同步方法已关闭。

这是我的一个线程的示例:(注意两个线程完全相同,除了正在打开的文件。)

 void *getMessage1() { FILE *studentOne = fopen("Student1", "r"); size_t howManyChars; char *placeHolderChars; int count = 1; while (count 0) { placeHolderChars[1] = '\0'; } strcat(message,placeHolderChars); } free(placeHolderChars); if(feof(studentOne)) { pthread_mutex_unlock(&lock); //unlock fclose(studentOne); break; } count++; } return 0; } 

这是我的主要方法:

 int main(void) { pthread_t id1; pthread_t id2; pthread_create((&id1), NULL, getMessage1, NULL); pthread_create((&id2), NULL, getMessage2, NULL); pthread_join(id1, NULL); pthread_join(id2, NULL); int j; for (j = 0; j < 1001; j++) { printf ("%c ",message[j]); } return 0; } 

我将非常感谢有关如何更好地使用锁定,解锁,等待和/或信号来创建具有一致结果的工作同步技术的任何指导。

这是一个尝试做一个你想要的程序。 但是测试不充分;)

 #include  #include  #include  #include  #include  using std::cout; using std::ifstream; using std::string; const string FILE1("file1.txt"); const string FILE2("file2.txt"); enum State { UNINITIALIZED, THREAD_ONE_READS, THREAD_TWO_READS }; struct ThreadInfo { State state; string filename; }; State state = UNINITIALIZED; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; void* thread_func(void* arg) { // Open file 'h'. ThreadInfo ti = *reinterpret_cast(arg); ifstream infile; infile.open (ti.filename.c_str(), std::ifstream::in); // while (not EOF) // Read 'h' or 'i': until 0 reached. Wake up other thread. string line; getline(infile, line); while (infile.good()) { cout << "Thread " << pthread_self() << " read " << line << '\n'; pthread_mutex_lock(&mut); while (state == ti.state) { pthread_cond_wait(&cond, &mut); } pthread_mutex_unlock(&mut); assert(line.length() == 1); if (line[0] == '0') { pthread_mutex_lock(&mut); state = ti.state; cout << "Got 0, transferring, setting state to " << state << '\n'; pthread_cond_signal(&cond); pthread_mutex_unlock(&mut); } else { cout << "Read char: " << line << '\n'; } getline(infile, line); } pthread_mutex_lock(&mut); state = ti.state; cout << "Finishing thread, transferring, setting state to " << state << '\n'; pthread_cond_signal(&cond); pthread_mutex_unlock(&mut); } int main() { // Create thread 1 // Create thread 2 pthread_t thread_one_handle; pthread_t thread_two_handle; state = THREAD_ONE_READS; int result; ThreadInfo info1 = { THREAD_TWO_READS, FILE1 }; result = pthread_create(&thread_one_handle, NULL, thread_func, &info1); assert(result == 0); ThreadInfo info2 = { THREAD_ONE_READS, FILE2 }; result = pthread_create(&thread_two_handle, NULL, thread_func, &info2); assert(result == 0); result = pthread_join(thread_one_handle, NULL); assert(result == 0); result = pthread_join(thread_two_handle, NULL); assert(result == 0); cout << "main(): joined both worker threads, ending program.\n"; return 0; }