北京SEO

Linux系统下C语言编程:线程的创建和使用

2019/10/10/17:48:19  阅读:2094  来源:谷歌SEO算法  标签: 百度细雨算法

线程的创建是用下面的几个函数来实现的.

  1. #includeintpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);voidpthread_exit(void*retval);intpthread_join(pthread*thread,void**thread_return);

pthread_create创建一个线程,thread是用来表明创建线程的ID,attr指出线程创建时候的属性,我们用NULL来表明使用缺省属性。start_routine函数指针是线程创建成功后开始执行的函数,arg是这个函数的唯一一个参数。表明传递给start_routine的参数。

pthread_exit函数和exit函数类似用来退出线程.这个函数结束线程,释放函数的资源,并在最后阻塞,直到其他线程使用pthread_join函数等待它。然后将*retval的值传递给**thread_return.由于这个函数释放所以的函数资源,所以retval不能够指向函数的局部变量。

pthread_join和wait调用一样用来等待指定的线程。下面我们使用一个实例来解释一下使用方法.在实践中,我们经常要备份一些文件。下面这个程序可以实现当前目录下的所有文件备份.备份后的后缀名为bak

  1. #include#include#include#include#include#include#include#include#include#include#include#defineBUFFER512structcopy_file{intinfile;intoutfile;};void*copy(void*arg){intinfile,outfile;intbytes_read,bytes_write,*bytes_copy_p;charbuffer[BUFFER],*buffer_p;structcopy_file*file=(structcopy_file*)arg;infile=file->infile;outfile=file->outfile;/*因为线程退出时,所有的变量空间都要被释放,所以我们只好自己分配内存了*/if((bytes_copy_p=(int*)malloc(sizeof(int)))==NULL)pthread_exit(NULL);bytes_read=bytes_write=0;*bytes_copy_p=0;while((bytes_read=read(infile,buffer,BUFFER))!=0){if((bytes_read==-1)&&(errno!=EINTR))break;elseif(bytes_read>0){buffer_p=buffer;while((bytes_write=write(outfile,buffer_p,bytes_read))!=0){if((bytes_write==-1)&&(errno!=EINTR))break;elseif(bytes_write==bytes_read)break;elseif(bytes_write>0){buffer_p+=bytes_write;bytes_read-=bytes_write;}}if(bytes_write==-1)break;*bytes_copy_p+=bytes_read;}}close(infile);close(outfile);pthread_exit(bytes_copy_p);}intmain(intargc,char**argv){pthread_t*thread;structcopy_file*file;intbyte_copy,*byte_copy_p,num,i,j;charfilename[BUFFER];structdirent**namelist;structstatfilestat;/*得到当前路径下面所有的文件(包含目录)的个数*/if((num=scandir(".",&namelist,0,alphasort))<0){fprintf(stderr,"GetFileNumError:%sna",strerror(errno));exit(1);}/*给线程分配空间,其实没有必要这么多的*/if(((thread=(pthread_t*)malloc(sizeof(pthread_t)*num))==NULL)||((file=(structcopy_file*)malloc(sizeof(structcopy_file)*num))==NULL)){fprintf(stderr,"OutOfMemory!na");exit(1);}for(i=0,j=0;id_name);if(stat(filename,&filestat)==-1){fprintf(stderr,"GetFileInformation:%sna",strerror(errno));exit(1);}/*我们忽略目录*/if(!S_ISREG(filestat.st_mode))continue;if((file[j].infile=open(filename,O_RDONLY))<0){fprintf(stderr,"Open%sError:%sna",filename,strerror(errno));continue;}strcat(filename,".bak");if((file[j].outfile=open(filename,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))<0){fprintf(stderr,"Creat%sError:%sna",filename,strerror(errno));continue;}/*创建线程,进行文件拷贝*/if(pthread_create(&thread[j],NULL,copy,(void*)&file[j])!=0)fprintf(stderr,"CreateThread[%d]Error:%sna",i,strerror(errno));j++;}byte_copy=0;for(i=0;i

广告内容

Linux系统下C语言编程:线程的创建和使用 Linux系统下C语言编程:线程的创建和使用 Linux系统下C语言编程:线程的创建和使用

相关阅读

热门评论

小明SEO博客 小明SEO博客

小明SEO博客,新时代SEO博客

总篇数171

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法