#include <stdio.h>
#include <pthread.h>
#define BUFFER_SIZE 99999 //足够大
// 全局共享的数据缓冲区
char buffer[BUFFER_SIZE];
int buffer_length = 0;
// 锁和条件变量用于线程同步
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 读取文件的线程函数
void *readFileThread(void *filename) {
// 打开文件
FILE *file = fopen((char *)filename, "r");
if (file == NULL) {
printf("无法打开文件\n");
pthread_exit(NULL);
}
// 读取文件数据到缓冲区
while (!feof(file)) {
// 加锁
pthread_mutex_lock(&mutex);
// 等待打印线程打印完毕
while (buffer_length != 0) {
pthread_cond_wait(&cond, &mutex);
}
// 读取数据到缓冲区
buffer_length = fread(buffer, sizeof(char), BUFFER_SIZE, file);
// 通知打印线程打印数据
pthread_cond_signal(&cond);
// 解锁
pthread_mutex_unlock(&mutex);
}
// 关闭文件
fclose(file);
pthread_exit(NULL);
}
// 打印数据的线程函数
void *printDataThread(void *arg) {
while (1) {
// 加锁
pthread_mutex_lock(&mutex);
// 等待读取线程读取数据
while (buffer_length == 0) {
pthread_cond_wait(&cond, &mutex);
}
// 打印数据
fwrite(buffer, sizeof(char), buffer_length, stdout);
fflush(stdout);
// 通知读取线程可以继续读取文件
buffer_length = 0;
pthread_cond_signal(&cond);
// 解锁
pthread_mutex_unlock(&mutex);
// 判断是否读取完毕
if (buffer_length == 0) {
break;
}
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t readThread, printThread;
if (argc != 2) {
printf("使用方法:%s <文件名>\n", argv[0]);
return 0;
}
// 创建读取文件的线程
if (pthread_create(&readThread, NULL, readFileThread, argv[1]) != 0) {
printf("无法创建读取文件的线程\n");
return 0;
}
// 创建打印数据的线程
if (pthread_create(&printThread, NULL, printDataThread, NULL) != 0) {
printf("无法创建打印数据的线程\n");
return 0;
}
// 等待线程结束
pthread_join(readThread, NULL);
pthread_join(printThread, NULL);
return 0;
}
倒置1234567(循环输出)
#include <head.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
char buf[]="1234567";
sem_t sem1;
void *callBack1(void *arg)
{
while(1)
{
if(sem_wait(&sem1)<0)
{
perror("sem_post");
return NULL;
}
printf("%s\n",buf);
if(sem_post((sem_t*)arg)<0)
{
perror("sem_post");
return NULL;
}
}
}
void *callBack2(void *arg)
{
int sz=sizeof(buf);
while(1)
{
if(sem_wait((sem_t*)arg)<0)
{
perror("sem_post");
return NULL;
}
int lift =0;
int right =sz-2;
while(lift<right)
{
char t=buf[lift];
buf[lift]=buf[right];
buf[right]=t;
lift++;
right--;
}
if(sem_post(&sem1)<0)
{
perror("sem_post");
return NULL;
}
}
}
int main(int argc, const char *argv[])
{
sem_t sem;
if(sem_init(&sem,0,1)<0)
{
perror("sem_init");
return -1;
}
if(sem_init(&sem1,0,1)<0)
{
perror("sem_init");
return -1;
}
if(sem_wait(&sem)<0)
{
perror("sem_post");
return -1;
}
pthread_t tid1 ,tid2;
if(pthread_create(&tid1,NULL,callBack1,(void*)&sem)!=0)
{
fprintf(stderr,"pthread fail __%d__\n",__LINE__);
return -1;
}
pthread_detach(tid1); //分离线程1
if(pthread_create(&tid2,NULL,callBack2,(void*)&sem)!=0)
{
fprintf(stderr,"pthread fail __%d__\n",__LINE__);
return -1;
}
pthread_join(tid2,NULL);
sem_destroy(&sem);
return 0;
}