Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43002
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-28 17:39
文章分类
文章存档

2015年(31)

我的朋友

分类: C/C++

2015-11-03 09:01:22

进程:程序的调度单位,程序的运行
线程:多道执行路径,拥有独立的栈空间
1.创建:
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routline)(void *), void *arg);
thread:线程的标志符
attr:线程属性,可以设置为NULL
start_routine:线程的入口函数
arg:传递给start_routine所指函数的参数

2.退出:
void pthread_exit(void *retval);

3.等待:
int pthread_join(pthread_t th, void **thread_return);

4.线程的取消:
一个线程向另外一个线程发送cancel信号,如何处理由目标线程确定,可以忽略、终止、或继续运行至cancel-point后终止。
int pthread_cancel(pthread_t thread);

5.线程清理
线程被外界取消或者发生中断,临界资源处于锁定状态。
从pthread_cleanup_push()和pthread_cleanup_pop()之间的程序段中的终止动作都将执行pthread_cleanup_push()所指定的清理函数;

void pthread_cleanup_push(void (*routine)(void *), void *arg);
void pthread_cleanup_pop(int execute);

这是以宏的方式定义的,需在同级代码中成对出现。
pthread_cleanup_pop()的参数execute如果是非0,则按栈顺序注销清理函数;如果为0,则在线程调用pthread_exit或者其他线程对本线程pthread_cancel时,

执行清理函数。

6.posix无名信号量

int sem_init(sem_t *sem, int pshared, unsigned int value);
value:
pshared:0,在线程中用posix的无名信号量

int sem_destroy(sem_t *sem);
返回值为-1表示有线程在等待该信号量

int sem_post(sem_t *sem);
int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);//如果信号量大于0,则原子减一,否则返回-1,errno置为EAGAIN;

//信号量的值保存到sval中
int sem_getvalue(sem_t *sem, int *sval);

7锁:实现资源一个时候只能有一个访问。

7.1创建
静态方式:
pthread_mutex_t mutex=PTHREAD_MUTEXT_INITIALIZER;

动态方式:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

7.2销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);

7.3锁的属性
typedef struct 
{
int  __mutextkind;
}pthread_mutexattr_t;

PTHREAD_MUTEX_TIMED_NP 快速锁
PTHREAD_MUTEXT_RECURSIVE_NP 嵌套锁,同一个线程可以获得多次,通过unlock解锁多次
PTHREAD_MUTEXT_ERRORCHECK_NP 检错锁

7.4锁的操作
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);

解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);

测试加锁:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
锁被占据时返回EBUSY

:使用中要用清理函数释放锁

8.条件变量
8.1创建和注销
静态方式:
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

动态方式:
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
cond_attr:属性,置NULL

注销:
int pthread_cond_destroy(pthread_cond_t *cond);

8.2等待
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

线程解开mutex指向的锁并被条件变量cond阻塞。如果有abstime,则经历abstime时间后阻塞自动解除。
mutex互斥锁必须是普通锁;

过程:
A:本线程加锁pthread_mutex_lock();
B:调用pthread_cond_wait()函数,这个函数会自动解锁,将本线程挂起
C:等到被pthread_cond_signal激发,锁恢复到锁定状态
D:最后要解锁pthread_mutex_unlock();

激活
int pthread_cond_signal(pthread_cond_t *cond);//激活队列中的一个
int pthread_cond_broadcast(pthread_cond_t *cond);//所有的都激活

用到锁,要使用清理函数

条件变量着重在等待,而无名信号(信号灯)着重在告诉资源可用
阅读(794) | 评论(0) | 转发(0) |
0

上一篇:linux通信

下一篇:网络

给主人留下些什么吧!~~