`
jakielong
  • 浏览: 223307 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

7)Linux程序设计入门--线程操作

阅读更多

前言:Linux下线程的创建

介绍在Linux下线程的创建和基本的使用. Linux下的线程是一个非常复杂的问题,由

于我对线程的学习不时很好,我在这里只是简单的介绍线程的创建和基本的使用,关于线

程的高级使用(如线程的属性,线程的互斥,线程的同步等等问题)可以参考我后面给出的

资料. 现在关于线程的资料在网络上可以找到许多英文资料,后面我罗列了许多链接,对

线程的高级属性感兴趣的话可以参考一下. 等到我对线程的了解比较深刻的时候,我回来

完成这篇文章.如果您对线程了解的详尽我也非常高兴能够由您来完善.

先介绍什么是线程.我们编写的程序大多数可以看成是单线程的.就是程序是按照一定的

顺序来执行.如果我们使用线程的话,程序就会在我们创建线成的地方分叉,变成两个"程

序"在执行.粗略的看来好象和子进程差不多的,其实不然.子进程是通过拷贝父进程的地

址空间来执行的.而线程是通过共享程序代码来执行的,讲的通俗一点就是线程的相同的

代码会被执行几次.使用线程的好处是可以节省资源,由于线程是通过共享代码的,所以没

有进程调度那么复杂.

线程的创建和使用

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

#include <pthread.h>;

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的参数. pthrea

d_exit函数和exit函数类似用来退出线程.这个函数结束线程,释放函数的资源,并在最后

阻塞,直到其他线程使用pthread_join函数等待它.然后将*retval的值传递给**thread_

return.由于这个函数释放所以的函数资源,所以retval不能够指向函数的局部变量. pt

hread_join和wait调用一样用来等待指定的线程. 下面我们使用一个实例来解释一下使

用方法.在实践中,我们经常要备份一些文件.下面这个程序可以实现当前目录下的所有文

件备份.备份后的后缀名为bak

#include <stdio.h>;
#include <unistd.h>;
#include <stdlib.h>;
#include <string.h>;
#include <errno.h>;
#include <pthread.h>;
#include <dirent.h>;
#include <fcntl.h>;
#include <sys/types.h>;
#include <sys/stat.h>;
#include <sys/time.h>;
#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<num;i++)
{
memset(filename,'\0',BUFFER);
strcpy(filename,namelist->;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<j;i++)
{
/* 等待线程结束 */
if(pthread_join(thread,(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;
/* 释放我们在copy函数里面创建的内存 */ 
free(byte_copy_p); 
}
}
printf("Total Copy Bytes %d\n\a",byte_copy);
free(thread);
free(file);
exit(0);
}

 线程的介绍就到这里了,关于线程的其他资料可以查看下面相关资料

Getting Started With POSIX Threads
The LinuxThreads library 

分享到:
评论

相关推荐

    Linux-C-programming.rar_linux 程序

    1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--...7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍

    Linux操作系统下C语言编程入门

    linux操作系统下 c语言编程入门 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--...7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍

    linux操作系统下C语言编程入门

    linux操作系统下C语言编程入门 目录介绍 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 ...7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍

    linux下C编程高效手册

    主要介绍Linux下的C语言编程开发。 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)程序设计入门--时间概念 ...7)Linux程序设计入门--线程操作 等等。。。

    linux下C语言基础

    1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--...7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍

    介绍linux下的c语言.pdf

    7)Linux程序设计入门-- 线程操作 ................................................................................35 8)Linux程序设计入门-- 网络编程 .........................................................

    linux程序设计入门

    关于Linux程序设计的知识 Linux程序设计基础知识 进程介绍 文件操作 时间概念 信号处理 线程 网络编程

    Linux程序设计权威指南

    目前Linux系统己很普及,但是介绍在Linux上进行开发的书籍并...Linux程序设计权威指南内容包括Linux开发环境、Linux编程的入门知识、系统和网络编程、多线程程序设计、控制台编程、XWindow系统编程、国际化编程知识等。

    linux操作系统下c语言编程入门

    linux操作系统下c语言编程入门1)Linux程序设计入门--基础知识,进程介绍,文件操作,时间概念,信号处理,消息管理,线程操作,网络编程,Linux下C开发工具介绍

    嵌入式Linux视频教程全套2011新版-国嵌嵌入式培训下载地址

    -国嵌应用班-7-4(UDP网络程序设计).avi -国嵌应用班-7-5(并发服务器).avi -国嵌应用班-7-6(必修实验).avi 国嵌视频3.iso -国嵌课程3-ARM系统进阶班 -第1天(ARM系统开发基础) -ARM系统精讲班-1-1(ADS集成...

    Linux程序设计 第4版.haozip01

    Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...

    Linux程序设计中文第4版.part2

     1.2 Linux程序设计  1. 2.1 Linux程序  1. 2.2 文本编辑器  1. 2.3 C语言编译器  1. 2.4 开发系统导引  1.3 获得帮助  1.4 小结 第2章 shell程序设计  2.1 为什么使用shell编程  ...

    Linux程序设计中文第4版.part1

     1.2 Linux程序设计  1. 2.1 Linux程序  1. 2.2 文本编辑器  1. 2.3 C语言编译器  1. 2.4 开发系统导引  1.3 获得帮助  1.4 小结 第2章 shell程序设计  2.1 为什么使用shell编程  2.2 一点...

    Linux-运维入门到高级全套系列.pdf

    全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年第一次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU...

    Linux程序设计 第4版.haozip02

    Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...

    Linux程序设计中文第4版.part3

     1.2 Linux程序设计  1. 2.1 Linux程序  1. 2.2 文本编辑器  1. 2.3 C语言编译器  1. 2.4 开发系统导引  1.3 获得帮助  1.4 小结 第2章 shell程序设计  2.1 为什么使用shell编程  ...

    mini2440国嵌视频教程+课件+工具+软件+镜像+教程源码下载地址

    -国嵌应用班-7-4(UDP网络程序设计).avi -国嵌应用班-7-5(并发服务器).avi -国嵌应用班-7-6(必修实验).avi 国嵌视频3.iso -国嵌课程3-ARM系统进阶班 -第1天(ARM系统开发基础) -ARM系统精讲班-1-1(ADS集成...

    linux入门文档

    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix...

Global site tag (gtag.js) - Google Analytics