- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux多线程编程讲义
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
文档评论(0)