linux多线程编程讲义.ppt
文本预览下载声明
linux多线程编程;1、Linux下线程概述;;;2、linux线程实现;2.1 线程创建与退出;创建进程:
#include pthread.h
pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg)
thread:线程标识符
attr:线程属性设置
start_routine:线程函数起始地址
arg:传递给start_routine的参数;;;2.2 修改线程属性;;;;;;;;;2.3 mutex互斥锁线程控制;;互斥锁可分为以下三种:
快速互斥锁:
递归互斥锁:
检错互斥锁:
这三种锁的主要区别在于其他未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。
快速互斥锁是指调用线程会阻塞直到拥有互斥锁的线程释放为止。
递归互斥锁能够成功返回并且增加调用线程在互斥上加锁的次数。
检错互斥锁则为快速互斥锁的阻塞版本,他会立即返回并得到一个错误。;互斥锁初始化:
#include pthread.h
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutex_attr_t *mutexattr)
Mutex:互斥锁
Mutexattr:PTHREAD_MUTEX_INITIALIZER:
创建快速互斥锁
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:
创建递归互斥锁
PTHREAD_REEORCHECK_MUTEX_INITIALIZER_NP:
创建检错互斥锁;;2.4 信号量线程控制;开始;开始;Linux实现了POSIX.1的无名信号量,用于线程的同步与互斥。信号量操作函数:
sem_init:用于创建一个信号量,并初始化它。
sem_wait或sem_trywait: 相当于P操作,它们都能使信号量减一,两者区别在于当信号量小于零时,sem_wait会阻塞,而sem_trywait则会立即返回。
sem_post:相当于V操作,它将信号量的值加一同时发出信号唤醒等待的进程。
sem_getvalue:得到信号量的值。
sem_destroy:删除信号量。
信号量实例见:sem_mutex.c sem_syn.c;/*mutex.c*/
#include stdio.h
#include stdlib.h
#include unistd.h
#include pthread.h
#include errno.h
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int lock_var;
time_t end_time;
void pthread1(void *arg);
void pthread2(void *arg);;
pthread_mutex_init(mutex,NULL);
ret=pthread_create(id1,NULL,(void *)pthread1, NULL);
if(ret!=0)
perror(pthread cread1);
ret=pthread_create(id2,NULL,(void *)pthread2, NULL);
if(ret!=0)
perror(pthread cread2);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
};void pthread1(void *arg)
{
int i;
while(time(NULL) end_time)
{
if(pthread_mutex_lock(mutex)!=0)
{
perror(pthread_mutex_lock);
}
else
printf(pthread1:pthread1 lock the variable\n);
for(i=0;i2;i++)
{
sleep(1);
lock_var++;
}
if(pthread_mutex_unlock(mutex)!=0)
{
perror(pthread_mutex_unlock);
}
else
printf(pthread1:pthread1 unlock the variable\n);
sleep(1);
}
};void pthread2
显示全部