一、思维导图

二、创建一个分支线程,在主线程中拷贝文件的前一部分,主线程拷贝文件的后一部分
#include <my_head.h>
void * callback(void * arg)
{
//打印分支线程id
printf("分支线程id=%ld\n",pthread_self());
//打开文件函数(标准IO)
FILE* src=fopen("./src.c","r");
FILE* dst=fopen("./dest.c","a+");
if(NULL==src||dst==NULL)
{
printf("无法拷贝文件下半部分\n");
return NULL;
}
printf("fopen success\n");
//计算主线程拷贝内容上限
fseek(src,0,SEEK_END);
long size=ftell(src);
//偏移光标
fseek(src,size/2,SEEK_SET);
//逐字节拷贝数据
char buf;
long flag=size/2;
while(1)
{
buf=fgetc(src);
fputc(buf,dst);
if(flag>=size-1)
{
printf("文件下半部分拷贝完成\n");
break;
}
flag++;
}
pthread_exit(NULL); //return NULL;
}
int main(int argc, const char *argv[])
{
//创建线程
pthread_t threadid;
if(0!=pthread_create(&threadid,NULL,callback,NULL))
{
ERRORLOG("pthread_create failure");
}
printf("pthread_create success\n");
//打印主线程id
printf("主线程id=%ld\n",pthread_self());
//阻塞主线程
pthread_join(threadid,NULL);
//打开文件函数(标准IO)
FILE* src=fopen("./src.c","r");
FILE* dst=fopen("./dest.c","a+");
if(NULL==src||dst==NULL)
{
ERRORLOG("fopen failure");
printf("无法拷贝文件上半部分\n");
return -1;
}
printf("fopen success\n");
//计算主线程拷贝内容上限
fseek(src,0,SEEK_END);
long size=ftell(src);
//偏移光标
fseek(src,0,SEEK_SET);
//逐字节拷贝数据
char buf;
long flag=0;
while(1)
{
buf=fgetc(src);
fputc(buf,dst);
if(flag>=size/2-1)
{
printf("文件上半部分拷贝完成\n");
break;
}
flag++;
}
return 0;
}
运行结果

三、解读代码
代码运行结果:
info1 from child process_1
info1 from parent process
四、解读代码, - 打印多少次
for(int i=0;i<3;i++)
{
fork()
printf("-")
}
预期线程数和打印次数
| 最终进程数 | 8 | 2*2*2 |
输出 - 次数 | 14 | 2+4+8 |
实际结果为最多打印24次
| 最终进程数 | 8 | 2*2*2 |
输出 - 次数 | 24 | 线程数2 缓冲区 - 个数:1*2=2 线程数4 缓冲区 - 个数:2*4=8 线程数4 缓冲区 - 个数:3*8=24 程序结束自动调用exit函数,打印缓冲区所有 - |
原因:printf 函数后未刷新缓冲区,故fork 函数会复制之前的缓冲区,最终会打印28次
打印理论次数的修改方式:
-
使用
fflush(stdout), -
改用
printf("-\n"), -
关闭缓冲
setbuf(stdout,NULL)
五、牛客刷题


553

被折叠的 条评论
为什么被折叠?



