#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: 放弃 abase abased abases abash abashed abashes abashing abasing abate abated abatement abates abates abattoir abbey abbort abbreviate abbreviates abbreviating abbreviations abdicate abduced abdicates abdicating腹部 abduct abducted
数据2:
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