以下程序的目的是学习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
答案 0 :(得分:0)
此处virtual
仅确保不会有多个线程同时访问您的全局变量。它没有为您安排线程的顺序提供任何保证。对于您想要执行的操作,mutex
是错误的同步原语,因为它的设计正是如此:排除其他线程同时访问同一资源。
您希望在另一个线程后明确允许特定线程。 可以使用mutex
完成。每个线程需要一个。因此,使用3个条目全局声明第二个semaphores
数组,将第一个初始化为1,将其他数据初始化为0.然后,只将线程数(0 - 2)传递给您的线程,做类似的事情:
sem_t