UNIX环境高级编程之----多线程技术(3)

       pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的。这些属性主要包括邦定属性、分离属性、堆栈地址、堆栈大小、优先级。其中系统默认的是非邦定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。

(1)邦定属性。

         在LINUX中,采用的是“一对一”的线程机制。也就是一个用户线程对应一个内核线程。邦定属性就是指一个用户线程固定地分配给一个内核线程,因为CPU时间片的调度是面向内核线程(轻量级进程)的,因此具有邦定属性的线程可以保证在需要的时候总有一个内核线程与之对应,而与之对应的非邦定属性就是指用户线程和内核线程的关系不是始终固定的,而是由系统来分配。

(2)分离属性。

        分离属性是决定以一个什么样的方式来终止自己。在非分离情况下,当一个线程结束时,它多占用的线程没有得到释放,也就是没有真正的终止,需要通过pthread_join来释放资源。而在分离属性情况下,一个线程结束时会立即释放它所占有的系统资源。但这里有一点要注意的是,如果设置一个线程分离属性,而这个线程又运行得非常快的话,那么它很可能在pthread_create函数返回之前就终止了线程函数的运行,它终止以后就很有可能将线程号和系统资源移交给其他的线程使用,这时调用pthread_create的线程就得到错误的线程号。

这些属性都是通过一些函数来完成的,通常先调用pthread_attr_init来初始化,之后来调用相应的属性设置函数。

1、pthread_attr_init

功能:        对线程属性变量的初始化。

头文件:     <pthread.h>

函数原型:   int pthread_attr_init (pthread_attr_t* attr);

函数传入值:attr:线程属性。

函数返回值:成功: 0

                失败: -1

2、pthread_attr_setscope

功能:        设置线程绑定属性。

头文件:     <pthread.h>

函数原型:   int pthread_attr_setscope (pthread_attr_t* attr, int scope);

函数传入值:attr: 线程属性。

                scope:PTHREAD_SCOPE_SYSTEM(绑定)

                         PTHREAD_SCOPE_PROCESS(非绑定)

函数返回值得:同1。

3、pthread_attr_setdetachstate

功能:        设置线程分离属性。

头文件:      <phread.h>

函数原型:    int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);

函数传入值:attr:线程属性。

                detachstate:PTHREAD_CREATE_DETACHED(分离)

                                  PTHREAD_CREATE_JOINABLE(非分离)

函数返回值得:同1。

4、pthread_attr_getschedparam

功能:       得到线程优先级。

头文件:    <pthread.h>

函数原型:  int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);

函数传入值:attr:线程属性;

                param:线程优先级;

函数返回值:同1。

5、pthread_attr_setschedparam

功能:       设置线程优先级。

头文件:     <pthread.h>

函数原型:   int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);

函数传入值:attr:线程属性。

                 param:线程优先级。

函数返回值:同1。

#include <stdlib.h>  
#include <stdio.h>  
#include <errno.h>  
#include <pthread.h>  
  
static void* pthread_func_1 (void*);  
static void* pthread_func_2 (void*);  
  
int main (int argc, char** argv)  
{  
  pthread_t pt_1 = 0;  
  pthread_t pt_2 = 0;  
  pthread_attr_t attr = {0};  
  int ret = 0;  
  
  pthread_attr_init (&attr); //属性设置
  pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);  
  pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);  
    
  ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);  
  if (ret != 0)  
  {  
    perror ("pthread_1_create");  
  }  
    
  ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);  
  if (ret != 0)  
  {  
    perror ("pthread_2_create");  
  }  
  
  pthread_join (pt_2, NULL);  
  
  return 0;  
}  
  
static void* pthread_func_1 (void* data)  
{  
  int i = 0;  
    
  for (; i < 6; i++)  
  {   
    printf ("This is pthread_1.\n");  
     
    if (i == 2)  
    {  
      pthread_exit (0);  
    }  
  }  
  
  return;  
}  
  
static void* pthread_func_2 (void* data)  
{  
  int i = 0;  
  
  for (; i < 3; i ++)  
  {  
    printf ("This is pthread_2.\n");  
  }  
  
  return;  
} 
[uglychen@chenxun linux_chen]$ cat  makefile 
ALL= pthread
LIB= -lpthread
objects= linux1.o
$(ALL) : $(objects)
        g++ -o $@ $(objects) $(LIB)
$(objects):%.o:%.cpp
        $(CC)  -c  $< -o $@
.PHONY : clean
clean:
        rm $(objects)

运行结果:

This is pthread1!
This is pthread2!
This is pthread2!
This is pthread2!
This is pthread1!
This is pthread1!

从上面事例中,可以得到这么一个结果,就是线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值