【LINUX】线程概述

【线程】
1、线程:轻量级的进程,程序执行流的最小单元,系统调度的基本单元。(线程ID.堆栈.寄存器集合.指针)进程内独立执行的一个单元。


2、POSIX 标准:操作系统与应用之间定义的一套API接口,增强可移植性。
   linux下本身不存在线程的概念,内核只提供了轻量级进程的支持,并未实现线程模型,所谓的“线程”本质上应该是进程的拷贝。
   
   int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg); 
   int pthread_join(pthread_t thread, void **rval_ptr);
   void pthread_exit(void *rval_ptr); //三种方式:1.隐式退出 2.pthread_exit(线程本身) 3.pthread_cancel(其他线程)
   int pthread_cancel(pthread_t tid);
   int pthread_equal(pthread_t tid1, pthread_t tid2); //比较线程ID
   pthread_t pthread_self(void); //获取线程ID
   void pthread_cleanup_push(void (*routine) (void  *),  void *arg)
   void pthread_cleanup_pop(int execute)
   
   线程状态:初始化、就绪、运行、阻塞、僵尸、终止、
   
   WIN32系统,线程的同步机制: 信号量、互斥量、事件、临界区(关键代码)
   类UNIX系统,线程的同步机制:信号量(POSIX/IPC)、互斥量、条件变量(等价于WIN事件)(???读写锁)。
   (1)互斥锁:排它性,只允许一个线程进入被互斥保护的代码。
#include <pthread.h>
pthread_mutex_t pMutex; //PTHREAD_MUTEX_INITIALIZER直接赋值,则不需要初始化函数
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destory(pthread_mutex_t *mutex);
备注:
PTHREAD_MUTEX_TIMED_NP:其余线程等待队列
PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争
PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;
PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争

   (2)读写锁:与互斥锁类似,但是拥有更高的并发性
#include <pthread.h>
pthread_rwlock_t pRWLock;
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destory(pthread_rwlock_t *rwlock);
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
   (3)条件变量:与互斥锁一起使用,允许线程以无竞争的方式等待特定条件的方式,条件变量本身由互斥量保护。基本操作(触发条件、等待条件、挂起线程等待其他线程触发条件)
条件变量就是cond_t,发送该变量,线程即被唤醒执行操作。
#include <pthread.h>
pthread_cond_t pCond;
int pthread_cond_init(pthread_cond_t *pCond, const pthread_rwlockattr_t *attr);   //init为动态初始化,PTHREAD_COND_INITIALIER为静态初始化
int pthread_cond_destory(pthread_cond_t *pCond);
int pthread_cond_wait(pthread_cond_t *pCond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *pCond, pthread_mutex_t *mutex, const struct timespec* timeout);
int pthread_cond_broadcast (pthread_cond_t *pCond); //用于通知线程条件已满足,唤醒等待该条件的所有线程
int pthread_cond_signal (pthread_cond_t *pCond); //用于通知线程条件已满足,唤醒等待该条件的某个线程

   (4)信号量:按照多线程程序设计中访问控制机制,控制对资源的同步访问,提供程序设计人员更方便的调用接口。
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int val);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);

    信号量与线程锁、条件变量相比还有以下几点不同:
   (1)锁必须是同一个线程获取以及释放,否则会死锁。而条件变量和信号量则不必。
   (2)信号的递增与减少会被系统自动记住,系统内部有一个计数器实现信号量,不必担心会丢失;而唤醒一个条件变量时,如果没有相应的线程在等待该条件变量,这次唤醒将被丢失。

3、 进程与线程:
(1)进程是系统资源分配的单位,线程是系统调度的单位
(2)线程是进程的内部单元,一个进程对应多个线程
(3)线程必须要依赖于进程而存在,相互之间可共享资源;而进程是独立存在,进程之间默认是独立
(4)进程有独立的地址空间,线程没有。

4、 [WIN32]
线程创建: CreateThread
线程终止:执行完成后退出;线程自身调用ExitThread函数即终止自己;被其他线程调用函数TerminateThread函数.
获取线程ID GetCurrentThreadId
创建互斥 CreateMutex
获取互斥 WaitForSingleObject、WaitForMultipleObjects
释放互斥 ReleaseMutex
创建信号量 CreateSemaphore
等待信号量 WaitForSingleObject
释放信号量 ReleaseSemaphore

[Linux]
线程创建:pthread_create
线程终止:执行完成后退出;执行完成后退出;由线程本身调用pthread_exit,退出被其他线程调用函数pthread_cance终止
获取线程ID: pthread_self
创建互斥: pthread_mutex_init
获取互斥: pthread_mutex_lock
释放互斥: phtread_mutex_unlock
创建信号量: sem_init
等待信号量: sem_wait
释放信号量: sem_post

[VxWorks]
线程创建:taskSpawn
线程终止:执行完成后退出;由线程本身调用exit退出;被其他线程调用函数taskDelete终止
获取线程ID: taskIdSelf
创建互斥: semMCreate
获取互斥: semTake
释放互斥: semGive
创建信号量: semBCreate、semCCreate
等待信号量: semTake
释放信号量: semGive


5、重载、覆盖(重写)
重载:同一个类中,参数列表不同
覆盖:不同的类中,函数名、参数列表均相同,必须要Virtual
隐藏:(1)子类与父类中,函数名相同,参数列表不同;父类被隐藏
  (2)子类与父类中,函数名相同,参数列表不同,没有Virtual,父类被隐藏
  
6、死锁形成的原因:系统资源不足、进程(线程)推进的顺序不恰当、资源分配不当
   死锁形成的条件:
互斥条件:所谓互斥就是进程在某一时间内独占资源。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值