<dl id='57ix3'></dl>

    <span id='57ix3'></span>

      <i id='57ix3'><div id='57ix3'><ins id='57ix3'></ins></div></i>

      <code id='57ix3'><strong id='57ix3'></strong></code>
      <fieldset id='57ix3'></fieldset>

      1. <acronym id='57ix3'><em id='57ix3'></em><td id='57ix3'><div id='57ix3'></div></td></acronym><address id='57ix3'><big id='57ix3'><big id='57ix3'></big><legend id='57ix3'></legend></big></address>

      2. <tr id='57ix3'><strong id='57ix3'></strong><small id='57ix3'></small><button id='57ix3'></button><li id='57ix3'><noscript id='57ix3'><big id='57ix3'></big><dt id='57ix3'></dt></noscript></li></tr><ol id='57ix3'><table id='57ix3'><blockquote id='57ix3'><tbody id='57ix3'></tbody></blockquote></table></ol><u id='57ix3'></u><kbd id='57ix3'><kbd id='57ix3'></kbd></kbd>
        <i id='57ix3'></i>

          1. <ins id='57ix3'></ins>

            Linux下C语言编程 线程操作入门常识

            • 时间:
            • 浏览:5
            • 来源:124软件资讯网

              线程的建立和使用

              线程的建立是用下面的几个函数来实现的  。

              #include
              int pthread_create(pthread_t *thread,pthread_attr_t *attr,
              void *(*start_routine)(void *),void *arg);
              void pthread_exit(void *retval);
              int pthread_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

              #define BUFFER 512
              struct copy_file {
              int infile;
              int outfile;
              };
              void *copy(void *arg)
              {
              int infile,outfile;
              int bytes_read,bytes_write,*bytes_copy_p;
              char buffer[BUFFER],*buffer_p;
              struct copy_file *file=(struct copy_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;
              else if(bytes_read>0)
              {
              buffer_p=buffer;
              while((bytes_write=write(outfile,buffer_p,bytes_read))!=0)
              {
              if((bytes_write==-1)&&(errno!=EINTR))break;
              else if(bytes_write==bytes_read)break;
              else if(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);
              }
              int main(int argc,char **argv)
              {
              pthread_t *thread;
              struct copy_file *file;
              int byte_copy,*byte_copy_p,num,i,j;
              char filename[BUFFER];
              struct dirent **namelist;
              struct stat filestat;

              if((num=scandir(".",&namelist,0,alphasort))<0)
              {
              fprintf(stderr,"Get File Num Error:%s\n\a",strerror(errno));
              exit(1);
              }

              if(((thread=(pthread_t *)malloc(sizeof(pthread_t)*num))==NULL)||
              ((file=(struct copy_file *)malloc(sizeof(struct copy_file)*num))==NULL)
              )
              {
              fprintf(stderr,"Out Of Memory!\n\a");
              exit(1);
              }

              for(i=0,j=0;i {
              memset(filename,'\0',BUFFER);
              strcpy(filename,namelist[i]->d_name);
              if(stat(filename,&filestat)==-1)
              {
              fprintf(stderr,"Get File Information:%s\n\a",strerror(errno));
              exit(1);
              }

              if(!S_ISREG(filestat.st_mode))continue;
              if((file[j].infile=open(filename,O_RDONLY))<0)
              {
              fprintf(stderr,"Open %s Error:%s\n\a",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 %s Error:%s\n\a",filename,strerror(errno
              ));
              continue;
              }

              if(pthread_create(&thread[j],NULL,copy,(void *)&file[j])!=0)
              fprintf(stderr,"Create Thread[%d] Error:%s\n\a",i,strerror(errno));
              j++;
              }
              byte_copy=0;
              for(i=0;i {

              if(pthread_join(thread[i],(void **)&byte_copy_p)!=0)
              fprintf(stderr,"Thread[%d] Join Error:%s\n\a",
              i,strerror(errno));
              else
              {
              if(bytes_copy_p==NULL)continue;
              printf("Thread[%d] Copy %d bytes\n\a",i,*byte_copy_p);
              byte_copy+=*byte_copy_p;

              free(byte_copy_p);
              }
              }
              printf("Total Copy Bytes %d\n\a",byte_copy);
              free(thread);
              free(file);
              exit(0);
              }