#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 %ldn", t);
rc = pthread_create(&threads[t], NULL, FRead, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %dn", 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, "%sn", stack[i]);
fclose(ofile);
}
fprintf(stderr, "%d data written to file result.datn", i);
pthread_exit(NULL);
return 0;
}
这是我的数据1和数据2文件
数据1: 放弃 降低 自卑 阿巴斯 使困窘 羞愧 阿巴什斯 唠叨 阿贝辛 减少 减弱 减少 减少 减轻 屠宰场 修道院 阿伯特 缩写 缩写 缩略语 缩略语 缩写 缩写 辞职 退位 退位 退位 腹部 绑架 绑架
数据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 个数据写入文件结果.dat
这是我的输出
1 个数据写入文件结果.dat
首先,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 %ldn", t);
rc = pthread_create(&threads[t], NULL, FRead, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %dn", 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, "%sn", stack[i]);
fclose(ofile);
}
fprintf(stderr, "%d data written to file result.datn", i);
pthread_exit(NULL);
return 0;
}