多线程小结

多线程
1.线程
一个进程可以有多个线程
用户级线程和核心级线程

创建 退出 等待
多进程 fork() exit() wait()
多线程 pthread_create() pthread_exit() pthread_join()

2.线程的创建和退出
pthread_create();//线程创建
pthread_exit();//线程退出
pthread_join();//当函数返回时,被等待子线程的资源被回收

#include <pthread.h>
int pthread_create(pthread_t* thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg);
void pthread_exit(void *retval);//(其参数可以被其它线程用 pthread_join 函数捕获)

void *(*start_routine)(void *);//void*类型的函数指针,参数也是void*类型

编译时执行
gcc a.c -lpthread

3.线程的等待退出
等待线程退出
#include <pthread.h>
int pthread_join(pthread_t th, void **thread_return);
void **thread_return //接受线程函数的返回值

线程的取消
一个线程向目标线程发 cancel 信号
int pthread_cancel(pthread_t thread);

线程终止清理函数
锁资源
pthread_cleanup_push()/pthread_cleanup_pop();//两者必须成对使用
void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pthread_cleanup_pop(int execute)

当 pthread_cleanup_pop()函数的参数为 0 时,仅仅在线程调用 pthread_exit 函数或者
其它线程对本线程调用 pthread_cancel 函数时,才在弹出“清理函数”的同时执行该“清理函数

4.线程的同步与互斥
4.1线程的互斥
mutex 函数

动态方式是采用 pthread_mutex_init()函数来初始化互斥锁
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
//mutexattr 用于指定互斥锁属性

pthread_mutex_destroy()用于注销一个互斥锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);

加锁 int pthread_mutex_lock(pthread_mutex_t *mutex)
解锁 int pthread_mutex_unlock(pthread_mutex_t *mutex)

set nu 或者 set number //显示行号;
set nonu 或者 set nonumber //关闭自动显示行号;

当一个线程加锁以后,其余请求锁的线程将形成一个阻塞等待队列,并在解锁后按优先级获得锁

嵌套锁 PTHREAD_MUTEX_RECURSIVE
允许同一个线程对同一个锁成功获得多次, 并通过多次 unlock 解锁。 如果是不同线程请求, 则在加锁线程解锁时重新竞争

测试加锁 int pthread_mutex_trylock(pthread_mutex_t *mutex)
//语义与 pthread_mutex_lock()类似, 不同的是在锁已经被占据时返回 EBUSY而不是挂起等待。

4.2线程的同步
条件变量

1.创建和注销
一个线程等待条件变量的条件成立而挂起
另一个线程使条件成立(给出条件成立信号)

为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
//cond_attr 值通常为 NULL

注销一个条件变量需要调用 pthread_cond_destroy(), 只有在没有线程在该条件变量上等待的时候
能注销这个条件变量, 否则返回 EBUSY

int pthread_cond_destroy(pthread_cond_t *cond);

2.等待和激发
无条件等待 pthread_cond_wait()
计时等待 pthread_cond_timedwait()
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);

做 pthread_cond_wait 之前, 往往要用pthread_mutex_lock 进行加锁, 而调用 pthread_cond_wait 函数会将锁解开, 然后将线程挂起阻塞。 直到条件被 pthread_cond_signal 激发, 再将锁状态恢复为锁定状态, 最后再用 pthread_mutex_unlock 进行解锁

激发条件有两种形式, pthread_cond_signal()激活一个等待该条件的线程, 存在多个等待线程时按
入队顺序激活其中一个; 而 pthread_cond_broadcast()则激活所有等待线程

在信号处理函数中调用 pthread_cond_signal()或者 pthread_cond_broadcast()很可能引起死锁。

pthread_cond_signal();//一次只能向一个线程发送信号
pthread_cond_broadcast();//可以向多个线程发送信号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值