文章目录
1. 前言
进程是CPU 分配资源的最小单位, 线程是系统调度的最小单位。
如果复制对方的地址空间,就产生出一个进程
如果共享对方的地址空间,就产生一个线程
2 线程相关操作
3 线程的创建
4 进程数据段共享和回收
资源回收
5 线程分离
主进程退出,线程也会退出
6 线程退出和取消
线程取消
7 线程属性(了解)
8 资源竞争
打印机模型
9 互斥锁
9.1 同步与互斥
、
互斥: 同一时刻只能一个人使用,必须等一个线程运行完毕,在执行另一个线程。
同步: 使用先后顺序,按次序完成特定的任务。比如A线程的运行依赖于B任务产生的数据。他也是一种互斥,但有先后顺序。
9.2 互斥锁
防止同一个资同时被多个任务使用。
初始化互斥锁
销毁
上锁
解锁
10 死锁
11 读写锁
读写锁是一个锁,读锁和写锁都是也给锁中的东西
初始化
12 条件变量
13 生产者消费者模型
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include <unistd.h>
typedef struct _node_t
{
int data;
struct _node_t *next;
}node_t;
node_t *head = NULL;
pthread_cond_t cond;
pthread_mutex_t mutex;
void *producer(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
node_t *new = malloc(sizeof(node_t));
if(NULL == new)
{
printf("malloc failed");
break;
}
memset(new, 0 ,sizeof(node_t));
new->data = random() % 100 +1;
new->next = NULL;
new->next = head;
head = new;
printf("生产者生产产品 %d\n", new->data);
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond);
sleep(random()%3 +1);
}
return NULL;
}
void *customer(void* arg)
{
node_t *tmp = NULL;
// 循环消费
while(1)
{
pthread_mutex_lock(&mutex);
if(NULL == head)
{
// 等待
printf("产品链表为空");
pthread_cond_wait(&cond, &mutex);
}
else
{
// 删除第一个节点
tmp = head;
head = head->next;
printf("消费者消费 %d\n", tmp->data);
free(tmp);
pthread_mutex_unlock(&mutex);
sleep(random() %3 +1);
}
}
return NULL;
}
int main()
{
pthread_t tid1 = -1, tid2 = -1;
srandom(getpid());
int ret = -1;
ret = pthread_mutex_init(&mutex, NULL);
if(0!= ret)
{
printf("pthread_cond_inti failed");
return 1;
}
ret = pthread_cond_init(&cond, NULL);
if(0!= ret)
{
printf("pthread_cond_inti failed");
return 1;
}
// 创建线程 生产者线程和消费者线程
pthread_create(&tid1, NULL, producer, NULL);
pthread_create(&tid2, NULL, customer, NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
14 信号量
P操作,占用资源
V操作,释放资源