pthread线程编程--POSIX的线程机制

来源:互联网 发布:外包公司java面试题 编辑:程序博客网 时间:2024/05/03 15:53

在linux下,线程和进程的概念和处理上,并没有象其他的操作系统一样的严格区分.线程在linux中,又会称为轻量级进程.而且和win系统很重要的区别是,在linux下面,新建的线程并不在原进程/线程中,而是通过clone()系统调用,生成了一个和原先的进程/线程完全一样的进程/线程,并在这个线程中执行线程的函数.

POSIX线程编程主要涉及的是POSIX的线程接口和一些相关的线程通讯的机制.
下面会介绍相关的POSIX线程的接口,和线程通讯机制,以及一些相应的结构体,在linux的kernel源码中都能找到:
在/usr/include/pthread.h文件中
extern int pthread_create(pthread_t *newthread,const pthread_attr_t *attr,void *(void *),void *arg);
函数功能:创建一个新线程;
第一个参数:唯一标识一个线程的线程ID;
第二个参数:新建线程的属性;
第三个参数:在新建线程中运行的函数;
第四个参数:传递给函数的参数.

说下结构体,和函数在同一文件中声明:
typedef unsigned long int pthread_t;//其实就是个唬人的unsigned long int型的数据,美其名曰提高可读性;
typedef union
{
    char size[PTHREAD_ATTR_T];
    long int align;
}pthread_attr_t;
//这个就是thread的的属性使用的结构体,你需要你新建的线程有什么属性,就设置这个结构体.

extern int pthread_join(pthread_t id,void **thread_return);
函数功能:等待一个线程的结束.
第一个参数:要等待结束的线程ID;
第二个参数:用户定义的指针,存储线程的返回值.
注意:一个线程不能被多个线程等待.

extern void pthread_exit(void *retval);
函数功能:退出一个线程.
第一个参数:记录函数的返回代码.

extern pthread_t pthread_self(void);
函数功能:获得线程自身的线程ID.

以上是常用的几个POSIX的线程接口,象其他的还有pthread_cancel(),pthread_detach()等函数,大家有兴趣可以自己去看看.

下面再说一下线程通讯的问题:
在linux下面,线程通讯的主要有三种方式:互斥锁,条件变量和信号量
1.互斥锁:
结构体名称为pthread_mutex_t,是一个有点长的结构体,我就不列出来了,想看看的话,你们知道的...
和互斥锁相关的pthread接口是:
pthread_mutex_init();
pthread_mutex_lock();
pthread_mutex_unlock();
pthread_mutex_destroy();

锁的属性:pthread_mutexaddr_t结构体来实现,如果想对锁做相应的属性配置,就设置这个结构体变量.

2.条件变量:
结构体名称为pthread_conf_t,
相关的接口函数是:
pthread_conf_init();
pthread_conf_wait();
pthread_conf_signal();
pthread_conf_broadcast();

条件变量的属性配置:pthread_confattr_t结构体来实现,如果要设置相应的变量的属性,就设置这个变量.

3.信号
typedef union
{
    char __size[SIZE_OF_SEM];
    long int __align;
}sem_t;
就是信号的结构体声明,没有sem_t的属性声明,因为sem_t的形式和以上两种的属性的结构形式是完全一样的.
那么和sem_t相关的接口是:
sem_init();
sem_post();
sem_wait();
sem_destroy();
对了sem_t的接口在/usr/include/semaphore.h中.

以上就是POSIX的一些接口的知识了,具体的接口大家可以自己去查看相关资料,其实不难.

以后有时间再详细讨论线程通讯的内容.

Thanks.

原创粉丝点击