八十六. 读写锁练习——代码
问题
相应解决的代码:
rwlock.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
// 全局变量
int number;
pthread_rwlock_t rwlock;
void* write_func(void* arg)
{
while(1)
{
//加写锁
pthread_rwlock_wrlock(&rwlock);
number++;
printf("+++ write number: %d\n", number);
//解锁
pthread_rwlock_unlock(&rwlock);
usleep(1000);
}
return NULL;
}
void* read_func(void* arg)
{
while(1)
{
pthread_rwlock_rdlock(&rwlock);
printf("--- read number: %d\n", number);
pthread_rwlock_unlock(&rwlock);
usleep(500);
}
return NULL;
}
int main(int argc, const char* argv[])
{
pthread_t thid[8];
pthread_rwlock_init(&rwlock, NULL);
// 创建3个写线程
for(int i=0; i<3; ++i)
{
pthread_create(&thid[i], NULL, write_func, NULL);
}
//创建5个读线程
for(int i=3; i<8; ++i)
{
pthread_create(&thid[i], NULL, read_func, NULL);
}
// 回收子线程的pcb
for(int i=0; i<8; ++i)
{
pthread_join(thid[i], NULL);
}
//释放读写锁资源
pthread_rwlock_destroy(&rwlock);
return 0;
}
八十七. 条件变量的使用思路
八十八. 条件变量相关函数介绍
这里pthread_cond_wait除了阻塞线程,还会将已经上锁的mutex解锁
八十九. 生产者和消费者模型代码实现
condition.c的代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
// 节点结构
typedef struct node
{
int data;
struct node* next;
}Node;
// 永远指向链表头部的指针
Node* head = NULL;
// 线程同步 - 互斥锁
pthread_mutex_t mutex;
// 阻塞线程 - 条件变量类型的变量
pthread_cond_t cond;
// 生产者
void* producer(void* arg)
{
while(1)
{
// 创建一个链表的节点
Node* pnew = (Node*)malloc(sizeof(Node));
// 节点的初始化
pnew->data = rand() % 1000; // 0-999
// 使用互斥锁保护共享数据
pthread_mutex_lock(&mutex);
// 指针域
pnew->next = head;
head = pnew;
printf("====== produce: %lu, %d\n", pthread_self(), pnew->data);
pthread_mutex_unlock(&mutex);
// 通知阻塞的消费者线程,解除阻塞
pthread_cond_signal(&cond);
sleep(rand() % 3);
}
return NULL;
}
void* customer(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
// 判断链表是否为空
if(head == NULL)
{
// 线程阻塞
// 该函数会对互斥锁解锁
pthread_cond_wait(&cond, &mutex);
// 解除阻塞之后,对互斥锁做加锁操作
}
// 链表不为空 - 删掉一个节点 - 删除头结点
Node* pdel = head;
head = head->next;
printf("------ customer: %lu, %d\n", pthread_self(), pdel->data);
free(pdel);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main(int argc, const char* argv[])
{
pthread_t p1, p2;
// init
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
// 创建生产者线程
pthread_create(&p1, NULL, producer, NULL);
// 创建消费者线程
pthread_create(&p2, NULL, customer, NULL);
// 阻塞回收子线程
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
九十. 使用条件变量,实现生产者消费者模型
无