什么是线程属性?线程属性控制着一个线程在它整个生命周期里的行为。在创建线程函数pthread_create函数的第二个参数就是设置线程属性。线程属性包括绑定属性、分离属性、堆栈地址、堆栈大小、优先级。当pthread_create函数的第二个参数设置为NULL时,就是采用默认属性,默认属性为非绑定,非分离、缺省1M的堆栈,与父进程同样级别的优先级。1)绑定属性线程可分为用户级线程和核心级线程两种,而绑定属性正是设置用户级线程和核心级线程之间的关系。绑定属性分为两种情况:绑定和非绑定。在绑定属性下,一个用户线程固守分配给一个内核线程,因为cpu时间片的调度是面向内核线程的,因此具有绑定属性的线程可以保证在需要的时候总有一个内核线程与之对应。在非绑定属性下,用户线程和内核线程的关系不是始终固定的,而是由系统来根据实际情况分配。2)分离属性分离属性是用来决定一个线程以什么样的方式来终止自己。分离属性分别两种情况:(1)在非分离情况下,当线 程结束时,它所占用的系统资源并没有立即释放。只有当pthread_join()函数返回时,创建的线程才会释放自己占用的系统资源。(2)在分离属性情况下,线程结束时立即释放它所占有的系统资源。
案例代码如下所示:
/*sem_mutex.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/ipc.h>
#include <semaphore.h>
int lock_var;
time_t end_time;
sem_t sem;
void pthread1(void *arg);
void pthread2(void *arg);
int main(int argc, char *argv[])
{
pthread_t id1,id2;
pthread_t mon_th_id;
int ret;
end_time = time(NULL)+30;
/*初始化信号量为 1*/
ret=sem_init(&sem,0,1);
if(ret!=0)
{
perror(&quot;sem_init&quot;);
}
/*创建两个线程*/
ret=pthread_create(&id1,NULL,(void *)pthread1, NULL);
if(ret!=0)
perror(&quot;pthread cread1&quot;);
ret=pthread_create(&id2,NULL,(void *)pthread2, NULL);
if(ret!=0)
perror(&quot;pthread cread2&quot;);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
}
void pthread1(void *arg)
{
int i;
while(time(NULL) < end_time)
{
/*信号量减一,P 操作*/
sem_wait(&sem);
for(i=0;i<2;i++)
{
sleep(1);
lock_var++;
printf(&quot;lock_var=%d\n&quot;,lock_var);
}
printf(&quot;pthread1:lock_var=%d\n&quot;,lock_var);
/*信号量加一,V 操作*/
sem_post(&sem);
sleep(1);
}
}
void pthread2(void *arg)
{
int nolock=0;
int ret;
while(time(NULL) < end_time)
{
/*信号量减一,P 操作*/
sem_wait(&sem);
printf(&quot;pthread2:pthread1 got lock;lock_var=%d\n&quot;,lock_var);
/*信号量加一,V 操作*/
sem_post(&sem);
sleep(3);
}
}复制代码 |