进程是CPU 分配资源的最小单位, 线程是系统调度的最小单位。
如果复制对方的地址空间,就产生出一个进程
如果共享对方的地址空间,就产生一个线程
资源回收
主进程退出,线程也会退出
线程取消
打印机模型
、
互斥: 同一时刻只能一个人使用,必须等一个线程运行完毕,在执行另一个线程。
同步: 使用先后顺序,按次序完成特定的任务。比如A线程的运行依赖于B任务产生的数据。他也是一种互斥,但有先后顺序。
防止同一个资同时被多个任务使用。
初始化互斥锁
销毁
上锁
解锁
读写锁是一个锁,读锁和写锁都是也给锁中的东西
初始化
#include
#include
#include
#include
#include
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;
}
P操作,占用资源
V操作,释放资源