#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 2
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
char **AddToStack(char *buffer)
{
static char **stack = NULL;
int stacksize = 0;
if (buffer == NULL)
return stack;
if (stack == NULL){
stack = calloc(1, sizeof(char*));
}
stack[stacksize] = strdup(buffer);
stacksize++;
stack = realloc(stack, (stacksize+1) * sizeof(char*));
stack[stacksize] = NULL;
return stack;
}
void *FRead(void *threadid)
{
pthread_mutex_lock(&mutex);
char fname[256], buffer[256];
FILE *ifile;
long tid;
int counter;
tid = (long)threadid;
sprintf(fname, "data%ld", tid);
if ((ifile = fopen(fname, "r")) == NULL){
printf("Error: Thread #%ld was unable to open file %s!\n", tid, fname);
}
else{
printf("Thread #%ld starting to read from file %s!\n", tid, fname);
fscanf(ifile, "%s", buffer);
counter = 0;
while (!feof(ifile)){
//pthread_mutex_lock(&mutex);
counter++;
AddToStack(buffer);
fscanf(ifile, "%s", buffer);
//pthread_mutex_unlock(&mutex);
}
fclose(ifile);
printf("Thread #%ld added %d entries to the stack!\n", tid, counter);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, i = 0;
long t;
char **stack;
FILE *ofile;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, FRead, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t=0;t<NUM_THREADS;t++)
{
//pthread_join(threads[t],NULL);
}
//Lets write the content of the stack into a file
stack = AddToStack(NULL); //Get the base of the stack pointer
if (stack != NULL){
ofile = fopen("result.dat", "w");
for (i = 0; stack[i] != NULL; i++)
fprintf(ofile, "%s\n", stack[i]);
fclose(ofile);
}
fprintf(stderr, "%d data written to file result.dat\n", i);
pthread_exit(NULL);
return 0;
}
这是我的data1和data2文件
DATA1: 退让 侮 自卑 abases 惑 愧 abashes abashing abasing 杀 减弱 减排 消退 缓和 屠宰场 僧院 abbort 简略 简短的 简写 缩写 缩写 缩写 退位 退位 退位 退位 腹部 拐 绑架
data2:
God
I
I'll
I'm
I've
Miss
Worry
a
ability
able
aboard
about
above
abroad
absence
absent
absolute
accident
accidentally
according
accordingly
account
acquaintance
across
act
action
active
activity
actual
admiration
admission
adress
advance
advantage
adventure
上面是我的互斥代码,但我想知道为什么我只能将1个数据写入文件result.dat
这是我的输出
1个数据写入文件result.dat
答案 0 :(得分:0)
首先,pthread_mutex_unlock(&mutex);pthread_exit(NULL);
位置不正确。将其放在return NULL
语句之前。
代码中有几处错误。请在下面找到更新的代码。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM_THREADS 2
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
char **AddToStack(char *buffer)
{
static char **stack = NULL;
static int stacksize = 0;
if (buffer == NULL)
return stack;
if (stack == NULL){
stack = (char**)calloc(1, sizeof(char*));
}
stack[stacksize] = strdup(buffer);
stacksize++;
stack = (char**)realloc(stack, (stacksize+1) * sizeof(char*));
stack[stacksize] = NULL;
return stack;
}
void *FRead(void *threadid)
{
pthread_mutex_lock(&mutex);
char fname[256], buffer[256];
FILE *ifile;
long tid;
int counter;
tid = (long)threadid;
sprintf(fname, "data%ld", tid);
if ((ifile = fopen(fname, "r")) == NULL){
printf("Error: Thread #%ld was unable to open file %s!\n", tid, fname);
}
else{
printf("Thread #%ld starting to read from file %s!\n", tid, fname);
fscanf(ifile, "%s", buffer);
counter = 0;
while (!feof(ifile)){
//pthread_mutex_lock(&mutex);
counter++;
AddToStack(buffer);
fscanf(ifile, "%s", buffer);
//pthread_mutex_unlock(&mutex);
}
fclose(ifile);
printf("Thread #%ld added %d entries to the stack!\n", tid, counter);
//pthread_mutex_unlock(&mutex);
//pthread_exit(NULL);
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, i = 0;
long t;
char **stack;
FILE *ofile;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, FRead, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t=0;t<NUM_THREADS;t++)
{
//pthread_join(threads[t],NULL);
}
//Lets write the content of the stack into a file
stack = AddToStack(NULL); //Get the base of the stack pointer
if (stack != NULL){
ofile = fopen("result.dat", "w");
for (i = 0; stack[i] != NULL; i++)
fprintf(ofile, "%s\n", stack[i]);
fclose(ofile);
}
fprintf(stderr, "%d data written to file result.dat\n", i);
pthread_exit(NULL);
return 0;
}