Linux中多线程,同步将一个文件内容复制到另一个文件里面
时间:2021-07-18
本文章向大家介绍Linux中多线程,同步将一个文件内容复制到另一个文件里面,主要包括Linux中多线程,同步将一个文件内容复制到另一个文件里面使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg); int pthread_join (pthread_t tid, void ** status);
pthread_create用于创建一个线程,成功返回0,否则返回Exxx(为正数)。
- pthread_t *tid:线程id的类型为pthread_t,通常为无符号整型,当调用pthread_create成功时,通过*tid指针返回。
- const pthread_attr_t *attr:指定创建线程的属性,如线程优先级、初始栈大小、是否为守护进程等。可以使用NULL来使用默认值,通常情况下我们都是使用默认值。
- void *(*func) (void *):函数指针func,指定当新的线程创建之后,将执行的函数。
- void *arg:线程将执行的函数的参数。如果想传递多个参数,请将它们封装在一个结构体中。
pthread_join用于等待某个线程退出,成功返回0,否则返回Exxx(为正数)。
- pthread_t tid:指定要等待的线程ID
- void ** status:如果不为NULL,那么线程的返回值存储在status指向的空间中(这就是为什么status是二级指针的原因!这种才参数也称为“值-结果”参数)。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd.h> #include <semaphore.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define N 3 //每次读取的字符数 /* 按顺序输出我是1我是2不会乱序。 */ sem_t rt, dt;//定义两个信号量 char buf[N] = {0}; int flag = 0; int fd_1,fd_2; void *fun_1(void *arg)//线程1 { char *p = (char *)arg; while(1) { //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行 sem_wait(&rt); //读 int red = read(fd_1,buf,sizeof(buf)); if(-1 == red) { perror("read"); break; } if(N > red) { flag = 1; sem_post(&dt); break; } puts(p); //释放资源,对应资源+1 sem_post(&dt); } } void *fun_2(void *arg)//线程2 { char *p = (char *)arg; while(1){ //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行 sem_wait(&dt); //写 int wre = write(fd_2,buf,strlen(buf)); if(-1 == wre) { perror("write"); break; } if(1 == flag) { break; } puts(p); //释放资源,对应资源+1 sem_post(&rt); } } int main()//main函数内为主线程,主线程在运行子线程才能正常运行。 { fd_1 = open("one.c",O_RDONLY); fd_2 = open("two.c",O_RDWR | O_CREAT | O_TRUNC,0777); if(-1 == fd_1) { perror("open one"); return -1; } if(-1 == fd_2) { perror("open two"); return -1; } pthread_t tid_1; pthread_t tid_2; if(0 != pthread_create(&tid_1, NULL, fun_1, "I am one!")){ perror("pthread_create1"); return -1; } if(0 != pthread_create(&tid_2, NULL, fun_2, "I am two!")){ perror("pthread_create1"); return -1; } //初始化信号量 if(0 != sem_init(&rt, 0, 1))//给rt分配1个资源 { perror("sem_init"); return -1; } if(0 != sem_init(&dt, 0, 0))//给dt分配0个资源 { perror("sem_init"); return -1; } //回收读线程 pthread_join(tid_1, NULL);//阻塞直到tid_1线程结束 //回收写线程 pthread_join(tid_2, NULL);//阻塞直到tid_2线程结束 printf("复制完成!"); close(fd_1); close(fd_2); }
原文地址:https://www.cnblogs.com/JinShanCheShen/p/15026064.html
- 聊一聊大数据的问题和缺陷
- Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag)
- 原来Silverlight 4中是可以玩UDP的!
- Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
- Flash/Flex学习笔记(11):如何检测摄像头是否被占用
- Flash/Flex学习笔记(10):FMS 3.5之Hello World!
- Swarm基于多主机容器网络-overlay networks 梳理
- 未来AI可能会淘汰180万个工作岗位,你感到恐惧了吗
- css基础:把所有背景图都集成在一张图片上,减少图片服务器请求次数
- Docker可视化界面(Consul+Shipyard+Swarm+Service Discover)部署记录
- windows 2008上启用防火墙后sqlserver 2005经常出现连接超时的解决办法
- 重温delphi之控制台程序:Hello World!
- Docker集中化web界面管理平台-Shipyard部署记录
- "Goole项目托管"及"CodePlex发布开源项目"要点
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- leetcode多线程之交替打印FooBar
- leetcode链表之反转链表
- leetcode链表之合并两个排序的链表
- leetcode链表之找出倒数第k个节点
- ZooKeeper能解决什么问题?不能解决什么问题?
- 画解算法 77-组合
- Spring 源码系列之容器概览~
- Spring Security 中如何让上级拥有下级的所有权限?
- Spring Security 权限管理的投票器与表决机制
- 通过cycler实现属性的自动映射
- 为你的图片添加图例
- matplotlib中的黑魔法:constrained和tight layout
- 用不同的坐标系统对图形元素进行定位
- 对《丢鸡蛋问题》的一点补充
- HA(高可用)就像套娃,像胖子,剥掉一层还有一层