Linux系统下C语言编程:线程的创建和使用
2019/10/10/17:48:19 阅读:2094 来源:谷歌SEO算法 标签:
百度细雨算法
线程的创建是用下面的几个函数来实现的.
- #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
- #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
热门评论