Unix环境多线程编程(一)

原创 2006年05月22日 13:46:00

在公司实习接近两个月了,我的导师让我在临近实习结束的日子里总结下我的收获,也就有了如下的几篇短文哈。我本学Java的,可误打误撞用起了C,要有错误要快快告诉我哈~

1.1        线程基础函数

1.1.1   数据类型

数据定义头文件 /usr/include/bits/pthreadtypes.h

typedef unsigned long int pthread_t;

线程标识符

pthread_attr_t

线程属性

 

1.1.2   API

1.1 #include <pthread.h>

函数pthread_create用来创建一个线程

int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);

返回: 如果成功0, 失败设置 Exxx error

 

第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。当二个参数设为空指针时,将生成默认属性的线程,否则将调用1.2节函数进行设置线程属性设置。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAINEINVAL。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

执行的函数原型必须为:

void func(void* param);  //无返回值,可传一个void* 类型的参数

此函数类似于进程创建函数fork();

 

返回错误信息

EAGAIN

系统限制创建新的线程,例如线程数目过多了

EINVAL

第二个参数代表的线程属性值非法。

 

 

1.2. #include <pthread.h>

函数pthread_join用来等待一个线程的结束

int pthread_join (pthread_t tid, void ** status);

返回: 如果成功0, 失败设置 Exxx error

 

第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回

一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH

此函数类似于进程等待函数 waitpid();

 

返回错误信息

ESRCH

线程被多个线程等待,第一个接收到信号的线程成功返回,其余调用pthread_join的线程返回次错误信息

 

 

1.3.#include <pthread.h>

获得线程号

pthread_t pthread_self (void);

返回: 调用线程ID

 

返回调用线程的线程标识符id,以用于其他函数。

此函数类似于进程函数 getpid();

 

 

1.4.#include <pthread.h>

设置线程状态为分离态

int pthread_detach (pthread_t tid);

返回: 如果成功0, 失败设置 Exxx error

 

 

每个线程或者为joinable(默认),或者为detached。当一个joinable的线程结束时,这个线程的Id和推出状态让然保留直到另外一个线程调用pthread_join函数。但是detached线程犹如后台进程:当它结束时,所有资源将被释放,不需要等待我们去释放。

如果一个线程需要知道何时另一个线程结束,最好保持此线程为joinable.

此函数常常被调用来使自己detach如:

Pthread_detach(pthread_self());

 

 

1.5. #include <pthread.h>

结束调用线程

void pthread_exit (void *status);

无返回值

 

一个线程的结束有两种途径,一种是函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。

唯一的参数是线程的返回值。他可能被其他线程的函数pthread_join处理。

 

1.1.3   Example

#include <pthread.h>

void thread(void)
{
   
int i;
   
for(i=0;i<3;i++)
   
printf("This is a pthread./n");
}

int main(void)
{
   
pthread_t id;
   
int i,ret;
   
ret=pthread_create(&id,NULL,(void *) thread,NULL);
   
if(ret!=0){
        
printf ("Create pthread error!/n");
        
exit (1);
   
}
   
for(i=0;i<3;i++)
       
printf("This is the main process./n");
   
pthread_join(id,NULL);
   
return (0);
}

 

ret=pthread_create(&id,NULL,(void *) thread,NULL);

主函数创建一个线程,使用默认线程属性NULL,线程执行体为函数thread,此函数无需传参数NULL

pthread_join(id,NULL);

等待线程函数结束。线程描述符为id

 

 

Unix环境多线程编程(一)[转]

在公司实习接近两个月了,我的导师让我在临近实习结束的日子里总结下我的收获,也就有了如下的几篇短文哈。我本学Java的,可误打误撞用起了C,要有错误要快快告诉我哈~1.1        线程基础函数1....
  • xuqing1980
  • xuqing1980
  • 2006年10月09日 17:27
  • 1721

Unix环境多线程编程(二)[转]

1.1        线程属性函数1.1.1   数据类型及总体说明 数据定义头文件 /usr/include/bits/pthr...
  • xuqing1980
  • xuqing1980
  • 2006年10月09日 17:33
  • 1426

Unix环境多线程编程(三) [转]

1.1.1   信号量使用POSIX 1003.1b信号量,有别于SystemV(ipc, semctl, semop)的信号量操作。信号量是为线程间共享的资源计数。信号量的基础操作是:原子性的增加计...
  • xuqing1980
  • xuqing1980
  • 2006年10月09日 17:33
  • 751

Unix环境多线程编程(二)

1.1        线程属性函数1.1.1   数据类型及总体说明 数据定义头文件 /usr/include/bits/pthr...
  • Apollo_zhc
  • Apollo_zhc
  • 2006年05月23日 16:58
  • 2777

Unix环境多线程编程(三)

1.1.1   信号量使用POSIX 1003.1b信号量,有别于SystemV(ipc, semctl, semop)的信号量操作。信号量是为线程间共享的资源计数。信号量的基础操作是:原子性的增加计...
  • Apollo_zhc
  • Apollo_zhc
  • 2006年05月24日 13:13
  • 2407

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译本文地址:http://blog.csdn.net/caroline_wendy时间:2014.10.21. 下载代码:http://www.apuebook....
  • u012515223
  • u012515223
  • 2014年10月02日 23:31
  • 3421

unix环境高级编程第三版源代码编译及使用

估计好多学习unix/linux的程序员都知道有这么一本书,最近笔者也开始膜拜膜拜此书,在编译源代码的时候,遇到了一些问题,现在在这里做下总结,加深自己的印象,或许也有遇到此问题的同仁,可以参考参考!...
  • aboboo5200
  • aboboo5200
  • 2017年03月01日 07:47
  • 1996

UNIX环境高级编程(第11章 线程)

线程原语包括pthread_create,pthread_exit,pthread_join,pthread_cancel,pthread_self,pthread_cleanup_push等...
  • lincoln_2012
  • lincoln_2012
  • 2014年11月12日 15:02
  • 328

UNIX环境高级编程---读后感

写在前面:本文只是自己对读这本的小结和感想,纯属个人观点。       (1)本书内容丰富,例子深入浅出,但还需自己多实践       总的来说,这本书还是不错的。前6章内容比较基础,主要涉及UN...
  • Hadas_Wang
  • Hadas_Wang
  • 2015年03月29日 15:11
  • 514

unix环境高级编程(文件和目录)

不是根据书实际写了,所有实际的数据均来自于我自己的ubuntu,下面操作系统的内核版本: Linux version 4.4.0-45-generic (buildd@lgw01-19) (gcc ...
  • u011555564
  • u011555564
  • 2016年11月11日 21:55
  • 186
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix环境多线程编程(一)
举报原因:
原因补充:

(最多只允许输入30个字)