创建两个线程,其中一个线程读取文件中的数据,另外一个线程将读取到的内容打印到终端上,类似实现cat一个文件。 cat数据完毕后,要结束两个线程。

#include 
#include 

#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 
#include 
#include 
#include 
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

线程整理O_ck钉钉钉的博客-CSDN博客

你可能感兴趣的:(转世重生,linux,c语言)