gpt4 book ai didi

c++ - PThread 堆栈上的互斥锁定和解锁

转载 作者:行者123 更新时间:2023-11-30 17:55:05 24 4
gpt4 key购买 nike

#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 文件

数据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

上面是我的互斥锁代码,但我想知道为什么我只能向文件 result.dat 写入 1 个数据

这是我的输出

1 条数据写入文件 result.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 %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;
}

关于c++ - PThread 堆栈上的互斥锁定和解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14555822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com