使用互斥锁和Pthread库输出错误

时间:2015-10-03 08:21:04

标签: c multithreading pthreads mutex

以下程序的目的是学习Mutex和Pthread库。 main()创建三个线程。 (第1,2和3号线)。
每个线程按顺序逐个读取每个文件一个字符(不同的文件)并存储到全局常量中。
示例线程1读取字符' a'从file1,然后等待线程2& 3相同(即从文件2和文件3分别读取' b'和#39;)。
读取完成后,我们希望main将全局常量打印到file.out

我试图编程相同但输出不正确。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdbool.h>

char glob_var, strtemp[1024];
pthread_mutex_t lock;
int cnt = 0;
char inp[3][10] = {"file-1.in", "file-2.in", "file-3.in"};

void * thread_func(void * arg);

void * thread_func(void * arg)
{
    FILE *fp;
    char * argu = (char *)arg;
    fp = fopen(argu, "r");
    while (1) {
        pthread_mutex_lock(&lock);
        glob_var = fgetc(fp);
        if(feof(fp))
        { 
            pthread_mutex_unlock(&lock);
            break ;
        }
        if (glob_var != '\n')
            strtemp[cnt++] = glob_var;
        pthread_mutex_unlock(&lock);
    }
    fclose(fp);

    return (void *)0;
}

int main(void)
{
    FILE * fpout;
    pthread_t threads[3];
    int i = 0;

    fpout = fopen("file.out", "w");

    for (i = 0; i < 3; i++)
        pthread_create(&threads[i], NULL, thread_func, (void *)inp[i]);

    for (i = 0; i < 3; i++)
        pthread_join(threads[i], NULL);

    strtemp[cnt] = '\0';
    cnt = 0;

    while(1) {
        glob_var = strtemp[cnt++];
        fprintf(fpout, "%c\n", glob_var);
        if (strtemp[cnt] == '\0') {
            break;
        }
    }
    fclose(fpout);

    return 0;
}
Input File

File1 File2 File3
a     u     t
o     .     #
e     p     a
i     r     m
e     n     $
Output File

From Above Code         Desired Output
t                       a
#                       u
r                       t
a                       o
m                       .
!                       #
$                       e
s                       p
m                       a
u                       i
.                       r
p                       m
r                       e
n                       n

1 个答案:

答案 0 :(得分:0)

此处virtual仅确保不会有多个线程同时访问您的全局变量。它没有为您安排线程的顺序提供任何保证。对于您想要执行的操作,mutex是错误的同步原语,因为它的设计正是如此:排除其他线程同时访问同一资源。

您希望在另一个线程后明确允许特定线程可以使用mutex完成。每个线程需要一个。因此,使用3个条目全局声明第二个semaphores数组,将第一个初始化为1,将其他数据初始化为0.然后,只将线程数(0 - 2)传递给您的线程,做类似的事情:

sem_t