在C中使用信号量进行多线程处理
这里的想法是创建一个要写入的文件。我正在尝试创建10个线程,并将它们打印到文件中,每次打印10次。使用信号量来阻止多个线程同时写入文件。所有的东西都编译了,我没有得到一个错误退出,但是我不明白为什么要多次运行这个程序:1)它没有打印100行到文件中,事实上它要少得多2)打印到文件中的行数每次都不同在C中使用信号量进行多线程处理,c,multithreading,pthreads,posix,semaphore,C,Multithreading,Pthreads,Posix,Semaphore,这里的想法是创建一个要写入的文件。我正在尝试创建10个线程,并将它们打印到文件中,每次打印10次。使用信号量来阻止多个线程同时写入文件。所有的东西都编译了,我没有得到一个错误退出,但是我不明白为什么要多次运行这个程序:1)它没有打印100行到文件中,事实上它要少得多2)打印到文件中的行数每次都不同 #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #inc
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define READ "r"
#define NEW "w"
#define ADD "a"
#define NL "\n"
#define TAB "\t"
#define FNAME "PROCTAB.txt"
#define MAX_STRING_LEN 80
#define NUMBER_OF_THREADS 10
FILE *fp;
sem_t mutex;
int counter;
FILE *makeTextFile(char *fname, char mode){
FILE *localFP;
localFP = fopen(fname, &mode);
return (localFP);
}
void *print_message(void *tid){
int i;
for (i = 0; i < 10; i++){
sem_wait(&mutex);
fp = fopen(FNAME, ADD);
fprintf(fp, "Thread %d is running.\n", tid);
fclose(fp);
sem_post(&mutex);
}
}
int threads(){
const char *fName = "PROCTAB.txt";
int status;
pthread_t threads[NUMBER_OF_THREADS];
fp = makeTextFile(FNAME, 'w');
fprintf(fp, "Process ID: %ld\n", (long)getpid());
fclose(fp);
int i;
for (i =0; i < NUMBER_OF_THREADS; i++){
status = pthread_create(&threads[i], NULL, &print_message, (void *)i);
if (status != 0){
printf("pthread_create returned error code %d\n", status);
exit(-1);
}
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义为“r”
#定义新的“w”
#定义并添加“a”
#定义NL“\n”
#定义选项卡“\t”
#定义FNAME“PROCTAB.txt”
#定义最大字符串长度80
#定义\u线程的数量\u 10
文件*fp;
sem_t互斥体;
整数计数器;
FILE*makeTextFile(char*fname,char模式){
文件*localFP;
localFP=fopen(fname,&mode);
返回(localFP);
}
void*打印消息(void*tid){
int i;
对于(i=0;i<10;i++){
sem_等待(&mutex);
fp=fopen(FNAME,ADD);
fprintf(fp,“线程%d正在运行。\n”,tid);
fclose(fp);
sem_post(和互斥);
}
}
int线程(){
const char*fName=“PROCTAB.txt”;
智力状态;
pthread_t threads[线程数];
fp=makeTextFile(FNAME,'w');
fprintf(fp,“进程ID:%ld\n”,(长)getpid();
fclose(fp);
int i;
对于(i=0;i<线程数;i++){
状态=pthread_create(&threads[i],NULL,&print_message,(void*)i);
如果(状态!=0){
printf(“pthread_create返回错误代码%d\n”,状态);
出口(-1);
}
}
返回0;
}
我的主要功能包含在一个单独的文件中 退出程序之前,需要等待所有线程完成 如果添加跟踪,您将看到哪个线程已完成
void *print_message(void *tid){
int i;
for (i = 0; i < 10; i++){
sem_wait(&mutex);
fp = fopen(FNAME, ADD);
fprintf(fp, "Thread %d is running.\n", tid);
fclose(fp);
sem_post(&mutex);
printf ( "Thread %d has finished.\n", tid);
}
}
void*打印消息(void*tid){
int i;
对于(i=0;i<10;i++){
sem_等待(&mutex);
fp=fopen(FNAME,ADD);
fprintf(fp,“线程%d正在运行。\n”,tid);
fclose(fp);
sem_post(和互斥);
printf(“线程%d已完成。\n”,tid);
}
}
这就是等待所有线程完成的方式
/* Wait for Threads to Finish */
for (i=0; i<NUMTHREADS; i++) {
pthread_join(thread[i], NULL);
}
/*等待线程完成*/
对于(i=0;iTestfp
infp=fopen(FNAME,ADD);
以确保您在所有您认为的时间内都成功地打开了文件。另外,将fp设置为print_message()
的本地。啊哈,我认为这是一个大问题,因为它没有等待每个线程完成。谢谢,它回答了您的问题?