欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【操作系统】Linux之线程同步二(头歌作业)

【操作系统】Linux之线程同步二(头歌作业)

2025/2/25 0:13:44 来源:https://blog.csdn.net/weixin_74154742/article/details/143759598  浏览:    关键词:【操作系统】Linux之线程同步二(头歌作业)

第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);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词