第1关:信号量
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>//全局信号量 sem1已被初始化为1,sem2被初始化为0
extern sem_t sem1, sem2;//全局共享变量
extern char *ch;/************************* 参数arg: 是线程函数的参数
*************************/
void *ThreadHandler1(void *arg)
{int i = 0;for(i = 0; i < 3; i++){/********** BEGIN **********/sem_wait(&sem1);/********** END **********/printf("%c", *ch);usleep(100);ch++;/********** BEGIN **********/sem_post(&sem2);/********** END **********/}pthread_exit(NULL);
}
/************************* 参数arg: 是线程函数的参数
*************************/
void *ThreadHandler2(void *arg)
{int i = 0;for(i = 0; i < 3; i++){/********** BEGIN **********/sem_wait(&sem2);/********** END **********/printf("%c", *ch);ch++;/********** BEGIN **********/sem_post(&sem1);/********** END **********/}pthread_exit(NULL);
}
第2关:读写锁
#include <stdio.h>
#include <pthread.h>//全局读写锁
extern pthread_rwlock_t rwlock;//全局共享变量
extern char buffer[3];
extern int position;/************************* 参数arg: 是线程函数的参数
*************************/
void *ReadHandler(void *arg)
{int i;for(i = 0; i < 3; i++){/********** BEGIN **********/pthread_rwlock_rdlock(&rwlock);/********** END **********/printf("%c\n", buffer[i]);/********** BEGIN **********/pthread_rwlock_unlock(&rwlock);/********** END **********/usleep(800);}pthread_exit(NULL);
}/************************* 参数arg: 是线程函数的参数
*************************/
void *WriteHandler(void *arg)
{/********** BEGIN **********/pthread_rwlock_wrlock(&rwlock);/********** END **********/buffer[position] = *(char*)arg;sleep(1);position++;/********** BEGIN **********/pthread_rwlock_unlock(&rwlock);/********** END **********/pthread_exit(NULL);
}
第3关:项目实战
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>//记录读线程的个数
extern int reader;//全局的信号量变量
extern sem_t sem_read, sem_write;//读写锁初始化函数
void sem_rwlock_init()
{reader = 0;//初始化信号量个1sem_init(&sem_read, 0, 1);sem_init(&sem_write, 0, 1);
}//读写锁注销函数
void sem_rwlock_destroy()
{sem_destroy(&sem_read);sem_destroy(&sem_write);
}//读模式下的加锁操作
void sem_rwlock_rdlock()
{//读模式下加锁操作/********** BEGIN **********/sem_wait(&sem_read);if (reader == 0){sem_wait(&sem_write); // 第一个读者要去读取数据,禁止写者进行写数据操作}reader++;sem_post(&sem_read);/********** END **********/
}//读模式下的解锁操作
void sem_rwlock_unrdlock()
{//读模式下解锁操作/********** BEGIN **********/sem_wait(&sem_read);reader--;if (reader == 0){sem_post(&sem_write); // 当读者数量为0时,允许写者进行写数据}sem_post(&sem_read);/********** END **********/
}//写模式下的加锁操作
void sem_rwlock_wrlock()
{sem_wait(&sem_write);
}//写模式下的解锁操作
void sem_rwlock_unwrlock()
{sem_post(&sem_write);
}