2024/3/3

文章展示了两个C语言程序片段,分别涉及线程间的数据交换和文件操作。第一个例子说明了在同一进程中,线程执行顺序的不确定性;第二个程序创建了两个线程,一个负责从大文件中读取部分数据并写入小文件,强调了并发处理和文件操作的并发控制。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>


char buf[] = "1234567";


void* daozhi(void* arg)
{
	int i;
	int j = strlen(buf)-1;
	while(1)
	{
		for(i=0;i<=j;i++,j--)
		{
			int temp = ((char*) arg)[i];
			((char*)arg)[i] = ((char*)arg)[j];
			((char*)arg)[j] = temp;
		}
		pthread_exit(NULL);
	}
	return arg;
}


int main(int argc, const char *argv[])
{
	pthread_t A;
	pthread_create(&A,NULL,daozhi,(void*)buf);

	pthread_join(A,NULL);
	while(1)
	{
		int i;
		for(i=0;i<7;i++)
		{
			printf("%c",buf[i]);
		}
		printf("\n");
	}

	return 0;
}

错误原因:同一进程下的线程由于时间片的分配原因,导致微观上线程进行的先后顺序不能确定

 

 

#include<stdio.h>
#include<pthread.h>
#include<errno.h>
#include<unistd.h>
void* FUNC(void*n)
{
	FILE* tp=fopen("./1.jpg","r");

	FILE* tp1=fopen("2.jpg","a+");
	fseek(tp,*(long*)n,SEEK_SET);

	size_t tupian;
	char msg;
	while(1)
	{
		tupian=fread(&msg,1,sizeof(msg),tp);
		fwrite(&msg,1,1,tp1);
		if(tupian==0)
		{
			printf("完成\n");
			break;
		}
	}
	fclose(tp);
	fclose(tp1);

	return 0;
}
int main(int argc, const char *argv[])
{
	FILE* tp3 =fopen("./1.jpg","r");
	if(NULL==tp3)
	{
		perror("opentp");
		return -1;
	}
	FILE* tp4 =fopen("2.jpg","w");
	if(NULL==tp4)
	{
		perror("opentp1");
		return -1;
	}

	long len; 
	fseek(tp3,0,SEEK_END);
	len=ftell(tp3);
	fseek(tp3,0,SEEK_SET);
	char msg;
	int qianban;
	long n=0;
	while(n<(len/2))
	{
		qianban=fscanf(tp3,"%c",&msg);
		fprintf(tp4,"%c",msg);


		if(qianban == EOF)
		{
			if(errno!=0)
			{
				perror("fscanfqianban");
				return -1;
			}
			break;
		}
		n++;
	}
	fclose(tp3);
	fclose(tp4);

	pthread_t photo;
	pthread_create(&photo,NULL,FUNC,(void*)&n);
	pthread_join(photo,NULL);


	return 0;                                          
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值