# 线程
## 特点
- 主线程退出时,子线程会被强制结束
- 线程之间共享全局变量
## 函数
1. 创建一个线程
```c
int pthread_create(
pthread_t *thread,//线程id(unsigned long int)
const pthread_attr_t *attr,//线程属性
void *(*start_routine) (void *),//线程处理函数
void *arg//参数
);
```
- * thread:传出参数,线程创建后会被设置一个合适的值
- * attr:设置线程分离,默认NULL(父子进程不分离,需要手动去回收线程pcb)
- * - int pthread_attr_init(pthread_attr\* attr);//初始化
- * - 设置线程分离属性
```c
int pthread_attr_setdetachstate(
pthread_attr_t* attr,//线程属性
int detachstate//PTHREAD_CREATE_DETACHED(分离) ..._JOINABLE(不分离)
)
```
- * start_routine:子线程处理函数
- * arg:传给回调函数的参数
- * 返回值:成功返回0,不成功返回错误号
2. 单个退出线程
- * void pthread_exit(void\* retval);
- * - retval:必须指向全局或者堆
3. 堵塞等待线程退出,获取线程退出状态
- * int pthread_join(pthread_t thread, void\*\* retval);
- * - thread:要回收的子线程的线程id
- * - retval:读取线程退出时携带的状态信息
```c
pthread_t pthid;
int ret = pthread_create(pthid, NULL, myfunc, NULL);
void* ptr;
pthread_join(pthid, &ptr);
```
4. 线程分离
- * int pthread_detach(pthread_t thread);
- * 调用该函数之后不需要pthread_join
- * 子线程会自动回收自己的pcb
5. 杀死线程
- * int pthread_cancel(pthread_t thread);
- * 注意
- * - 再要杀死的子线程对应的处理函数的内部,必须做过一次系统调用
- * - write read printf ...
6. int pthread_equal(pthread_t t1, pthread_t t2);
- * 判断两个线程ID是否相等 预留函数
## 线程同步
### 互斥量(互斥锁)
- 类型:pthread_mutex_t mutex;
- 特点:
- * 多个线程串行访问共享数据
- * 效率低
- 使用步骤:
- 1. 创建一个互斥锁 pthread_mutex_t mutex;
- 2. 初始化 pthread_mutex_init(&mutex, NULL);
- 3. 加锁 pthread_mutex_lock(&mutex);
- 4. 解锁 pthread_mutex_unlock(&mutex);
- 相关函数介绍
```
//初始化锁
pthread_mutex_init(
pthread_mutex_t* restrict mutex,//锁
const pthread_mutexattr_t* restrict attr//锁的属性
);
//销毁锁(释放)
pthread_mutex_destory(pthread_mutex_t* mutex);
//加锁会堵 直到锁打开为止
pthread_mutex_lock(pthread_mutex_t* mutex);
//尝试加锁不堵塞,成功返回0
pthread_mutex_trylock(pthread_mutex_t* mutex);
//解锁
pthread_mutex_unlock(pthread_mutex_t* mutex);
```
### 读写锁
- 类型:pthread_rwlock_t lock;
- 读锁:对内存做读操作
- 写锁:对内存做写操作
#### 读写锁的特性
- 线程A加读锁成功,又来三个变量做读操作,可以加锁成功
- 线程A加写锁成功,又来三个线程做读操作,三个线程堵塞
- 线程A加读锁成功,有来了线程B加写锁堵塞,又来了线程C加读锁堵塞
- 读共享、写独占、写优先级高、
#### 读写锁场景练习
1. 线程A加写锁成功,然后线程B请求读锁?失败
2. 线程A加读锁成功,然后线程B请求写锁?堵塞
3. 线程A加读锁成功,然后线程B请求读锁?成功
4. 线程A加读锁成功,然后线程B请求写锁?失败。然后线程C请求读锁?失败
5. 线程A加写锁成功,然后线程B请求读锁,然后线程C请求写锁,
- * BC堵塞
- * A解锁,C加写锁成功,B继续堵塞
- * C解锁,B加读锁成功。
注:程序中读操作较多是建议使用读写锁
#### 读写锁操作函数
```c
pthread_relock_t rwlock;//定义一把读写锁
//初始化读写锁
pthread_rwlock_init(
pthread_relock_t* restrict rwlock,
const pthread_ewlockattr* restrict attr
);
//销毁读写锁
pthread_rwlock_destroy(phread_rwlock_t* rwlock);
//加读锁
pthread_rwlock_rdlock(pthread_rwlock_t* rwlock);
//尝试加读锁 成功返回0 错误返回错误号
pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock);
//加写锁
pthread_rwlock_wrlock(pthread_rwlock_t* rwlock);
//尝试加写锁
pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock);
//解锁
pthread_rwlock_unlock(pthread_rwlock_t* rwlock);
```
练习:3个线程不定时写同一全局资源,5个线程不定时读同一全局资源
### 条件变量
- 读写锁不是什么时候都能堵塞线程
- 条件变量:在不满足条件时堵塞线程
```c
pthread_cond_t cond;
//初始化体格天剑变量
pthread_cond_init(
pthread_cond_t* restrict cond,
const pthread_condattr* restrict attr
);
//销毁条件变量
pthread_cond_destroy(pthread_cond_t* cond);
//堵塞等待一个条件变量
//堵塞线程,将已经上锁的mutex解锁
pthread_cond_wait(
pthread_cond_t* cond,
pthread_mutex_t* restrict mutex
);
//限时等待一个条件变量,将已经加锁的mutex解锁
struct timespec abstime;
time_t cur = time(NULL);
abstime.tv_sec = cur+1;
pthread_cond_timedwait(
pthread_cond_t* cond,
pthread_mutex_t* restrict mutex,
const struct timespec* restrict abstime
);
//唤醒堵塞的进程并对互斥锁mutex加锁
pthread_cond_signal(pthread_cond_t* cond);//唤醒至少一个
pthread_cond_broadcast(pthread_cond_t* cond);//唤醒全部
```
#### 生产者消费者模型
```C
//消费者
while(true)
{
//判断是不是有烧饼
pthread_mutex_lock();
if(head == NULL)
{
pthread_cond_wait(&cond, &mutex);//堵塞等待
}
//吃烧饼
pthread_mutex_unlock();
sleep(1);
}
//生产者
while(true)
{
//创建一个节点(烧饼)
pthread_mutex_lock(&mutex);
//节点插入到链表
pthread_mutex_unlock(&mutex);
pthread_cond_signal(cond);//通知堵塞的消费者解除堵塞
}
```
### 信号量
- #include <semaphore.h>
- 类型:sem_t sem;//加强版的互斥锁
- 函数
```c
//初始化信号量
sem_init(
sem_t* sem,
int pshared,//1 进程同步, 0线程同步
unsigned int value//信号量个数
);
//销毁信号量
sem_destroy(sem_t* sem);
//加锁--
sem_wait(sem_t* sem);
//尝试枷锁 成功返回0 不成功返回错误号
sem_trywait(sem_t* sem);
//限时尝试枷锁
sem_timedwait(sem_t* sem, xxxx);
//解锁++
sem_post(sem_t* sem);
```
### 哲学家就餐问题
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业和服务提供商的首选操作系统,用于部署Web服务器、数据库服务器、邮件服务器等。Linux系统具有高效的网络功能和稳定的性能,因此被广泛应用于服务器领域,Linux是云计算的核心组成部分,被广泛用于构建云平台和云服务。许多知名的云计算服务提供商都采用Linux系统作为其基础架构,一些游戏平台和游戏开发工具采用Linux作为支持的操作系统,例如Steam平台上的某些游戏。Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
资源推荐
资源详情
资源评论
收起资源包目录
Linux系统设计-Linux系统调用 (270个子文件)
75 0B
creatfile.sh.bck 285B
bck.sh.bck 63B
3.bck 0B
8.bck 0B
76.bck 0B
6.bck 0B
4.bck 0B
2.bck 0B
1.bck 0B
5.bck 0B
7.bck 0B
myshell.c 5KB
qq_ipc_client.c 4KB
qq_ipc_server.c 3KB
demo_cp.c 3KB
mult_process_cp.c 2KB
link.c 1KB
t.c 304B
alarm_1s_num.c 152B
client 19KB
client 19KB
client 19KB
client 19KB
client 19KB
client 19KB
client 14KB
client 14KB
client 14KB
client 13KB
client 8KB
file_dst.cp 4.78MB
server_2.cpp 10KB
server.cpp 7KB
server.cpp 4KB
server.cpp 3KB
server.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
wrap.cpp 3KB
server.cpp 3KB
server.cpp 3KB
server.cpp 3KB
server.cpp 3KB
server.cpp 3KB
prodcer_customer_cond.cpp 2KB
stat.cpp 2KB
server.cpp 2KB
test01_gettime_file.cpp 2KB
prodcer_customer_sem.cpp 2KB
test01.cpp 2KB
pthread_attr.cpp 2KB
fork_mutex.cpp 2KB
server.cpp 2KB
more_fork_cp.cpp 2KB
threefork.cpp 2KB
server.cpp 2KB
client.cpp 2KB
forfork.cpp 1KB
pthread_rwlock.cpp 1KB
server.cpp 1KB
pipe3.cpp 1KB
pipe.cpp 1KB
pthread_more_mutex.cpp 1KB
client.cpp 1KB
client.cpp 1KB
pthread_create.cpp 1KB
client.cpp 1KB
wait.cpp 1KB
client.cpp 1KB
client.cpp 1KB
client.cpp 1KB
client.cpp 1KB
client.cpp 1KB
client.cpp 1KB
forkfile.cpp 1KB
parent_child_mmap.cpp 1KB
no_relationship_w.cpp 1KB
lseek.cpp 966B
signal_set.cpp 919B
fork.cpp 910B
raise_abort.cpp 883B
regex.cpp 880B
pthread_cancle.cpp 876B
no_relationship_r.cpp 860B
fcntl.cpp 849B
exec.cpp 815B
anommap.cpp 805B
mmap.cpp 791B
unlink.cpp 779B
setitimer.cpp 729B
kill.cpp 685B
fork.cpp 561B
fork.cpp 561B
共 270 条
- 1
- 2
- 3
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功