C语言多线程-读写公共数据缓冲区


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
char buffer[128];
int has_data=0;

void read_buf(void)
{
	sleep(1);
	if(has_data==1)
	{
		printf("the data is:\n");
		printf("%s\n",buffer);
	}
	//pthread_exit(NULL);
}
void write_buf(void )
{
	do
	{
		if(has_data==0)
		{
			memset(buffer,'\0',128);
			printf("input data:");
			scanf("%s",buffer);
		}
	sleep(1);
	}while(strcmp(buffer,"exit")!=0);
	//pthread_exit(NULL);
}
int main(int argc ,char **argv)
{
	pthread_t id1,id2;
	int ret1,ret2;
	ret1=pthread_create(&id1,NULL,(void *)write_buf,NULL);
	if(ret1!=0)
	{
		printf("create error\n");
		exit(1);
	}
	ret2=pthread_create(&id2,NULL,(void *)read_buf,NULL);
	if(ret2!=0)
	{
		printf("create error\n");
		exit(1);
	}
	pthread_join(id1,NULL);
	pthread_join(id2,NULL);
	
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个利用多线程处理大文件的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define THREAD_COUNT 4 // 线程数量 struct ThreadParam { FILE *fp; // 文件指针 long long start; // 读写起始位置 long long end; // 读写结束位置 char *buffer; // 缓冲区 }; void *threadFunc(void *arg) { struct ThreadParam *param = (struct ThreadParam *) arg; FILE *fp = param->fp; fseek(fp, param->start, SEEK_SET); // 设置读写起始位置 fread(param->buffer, 1, param->end - param->start, fp); // 读取数据到缓冲区 // 对缓冲区中的数据进行处理 // ... pthread_exit(NULL); } int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s <filename>\n", argv[0]); exit(EXIT_FAILURE); } FILE *fp = fopen(argv[1], "rb"); if (!fp) { printf("Failed to open file %s\n", argv[1]); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); long long fileSize = ftell(fp); // 获取文件大小 long long chunkSize = fileSize / THREAD_COUNT; // 计算每个线程处理的块大小 char *buffer = (char *) malloc(chunkSize); // 创建缓冲区 pthread_t threads[THREAD_COUNT]; struct ThreadParam params[THREAD_COUNT]; for (int i = 0; i < THREAD_COUNT; i++) { params[i].fp = fp; params[i].buffer = buffer; params[i].start = i * chunkSize; params[i].end = (i == THREAD_COUNT - 1) ? fileSize : (i + 1) * chunkSize; pthread_create(&threads[i], NULL, threadFunc, &params[i]); // 创建线程 } for (int i = 0; i < THREAD_COUNT; i++) { pthread_join(threads[i], NULL); // 等待线程结束 } free(buffer); // 释放缓冲区 fclose(fp); // 关闭文件 return 0; } ``` 该示例代码中,首先通过 fseek 和 ftell 函数获取文件大小,然后计算出每个线程处理的块大小,创建缓冲区并分别创建多个线程进行读取和处理,最后等待线程结束并释放缓冲区和关闭文件。需要注意的是,对于多线程读写文件,需要考虑线程同步和互斥问题,可以使用互斥锁和条件变量来解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值