unix编程之线程 笔记

什么是线程?

在一个程序中的多个执行路线就叫做线程。或者说线程是一个进程内部的一个控制序列。

fork系统调用:fork时,创建出的是调用fork的函数的一份新副本。它拥有自己的变量和PID,它的时间调度也是独立的,执行完全独立于父进程。

线程创建:新的执行线程拥有自己的栈(因此它有自己的局部变量),但它与创建者共享全局变量、文件描述符、信号处理函数和当前目录状态。


 第一个线程程序

线程有一套完成的函数库调用。需要加上头文件pthread.h以及宏_REENTRANT,编译时需要加上-lpthread。

宏_REENTRANT告诉编译器我们需要可重入功能,该宏必须位于程序中的最顶部。

注:书上说需要加入该宏,但我实际编译时并没使用该宏,同样可以编译运行。


创建新线程:

#include <pthread.h>

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

pthread_t *thread存放被创建线程的标识符。

pthread_attr_t *attr设置线程属性,通常可设置为NULL。

void *(*start_routine)(void *), void *arg告诉线程将要启动执行的函数和传递给该函数的参数。


线程终止:

#include <pthread.h>

void pthread_exit(void *retval);


线程等待:

#include <pthread.h>

int pthread_join(pthread_t th, void **thread_return);

该函数与wait类似,第一个参数指定了要等待的线程,第二个参数是一个指针,它指向另一个指针,而后者指向线程的返回值。


同步

两种基本的控制线程执行和访问代码临界区的方法:信号量、互斥量。

POSIX实时扩展函数用于线程;系统V信号量函数,常用于进程同步。

信号量是一个特殊类型的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。这就保证了如果程序中有两个(或更多)的线程试图改变一个信号量的值,系统保证所有的操作都将依次进行。

信号量的作用就是用来保证对临界区代码的访问是依次的。

二进制信号量:只有0和1两种取值。

计数信号量:有更大的取值范围。


信号量函数的名字都已sem_开头。4个基本信号量函数:

信号量创建:

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);


控制信号量指:

#include <semaphore.h>

int sem_wait(sem_t *sem);

int sem_post(sem_t *sem);

sem_post函数的作用:以原子方式给信号量的值加1。

sem_wait函数的作用:以原子方式给信号量的值减1。只有当信号量值为非零值时才进行减操作。


清理函数:

#include <semaphore.h>

int sem_destory(sem_t *sem);


未完待续


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值