linux信号量封装

项目描述

该项目用来封装linux信号量的操作,方便我们操作信号量。

使用信号量可以实现如下目的:

1、共享资源的互斥操作

2、进程间的同步操作

项目架构

该项目最终生成动态库libsem_common.so

使用说明:

包含头文件sem_common.h

编译动态库libsem_common.so

项目截图

(1)利用信号量实现共享资源互斥操作(一个进程在操作共享资源时,另一个进程是不允许对共享资源同时进行操作的)

account.h(银行账户的头文件,主要是对账户的一些操作的申明):

#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__

typedef struct
{
    int     code;
    double  balance;
    int     semid;  //在共享资源上绑定一个信号量集
}Account;

//取款
extern double withdraw(Account *a, double amt);

//存款
extern double deposit(Account *a, double amt);

//查看账户余额
extern double get_balance(Account *a);


#endif

 account.c(银行账户的C文件,账户操作的实现):

#include <stdio.h>
#include <string.h>
#include "account.h"
#include <assert.h>
#include "pv.h"

//取款
double 
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答您的问题。首先,让我们来解释一下“哲学家吃饭问题”,它是一个经典的计算机科学问题,通常用来说明并发编程中的死锁问题。 在这个问题中,有五个哲学家围坐在一张圆桌前,每个哲学家面前有一碗饭和一只筷子,他们只能用左右两边的筷子来吃饭。但是,每个哲学家只能同时拿起一只筷子,如果他们都拿起了自己左边的筷子,就会发生死锁,因为没有人能够拿到右边的筷子。 现在,让我们看看如何在Linux下实现这个问题的演示程序。 1. 变量命名 为了实现这个问题,我们需要定义五个哲学家和五个筷子(或者用信号量代替)。我们可以使用数组来表示哲学家和筷子,如下所示: ``` #define N 5 sem_t chopsticks[N]; pthread_t philosophers[N]; ``` 其中,N表示哲学家和筷子的个数,sem_t表示信号量类型,chopsticks表示筷子,philosophers表示哲学家。 2. 确定P、V操作流程 在Linux下,我们可以使用sem_wait()函数来进行P操作,使用sem_post()函数来进行V操作。具体流程如下: - 当一个哲学家想要拿起一只筷子时,他需要进行P操作,即sem_wait(&chopsticks[i]),其中i表示筷子的编号。 - 当一个哲学家用完一只筷子时,他需要进行V操作,即sem_post(&chopsticks[i]),表示放下筷子。 3. 使用信号量操作的函数处理 为了更方便地进行P、V操作,我们可以封装一些函数来处理。下面是几个常用的函数: - 初始化信号量: ``` void init_semaphore(sem_t *sem, int val) { sem_init(sem, 0, val); } ``` - P操作: ``` void semaphore_wait(sem_t *sem) { sem_wait(sem); } ``` - V操作: ``` void semaphore_post(sem_t *sem) { sem_post(sem); } ``` 4. 程序测试调试 最后,我们需要编写一个主函数来初始化信号量、创建线程、执行哲学家吃饭的过程。具体实现可以参考如下代码: ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h> #define N 5 sem_t chopsticks[N]; pthread_t philosophers[N]; void init_semaphore(sem_t *sem, int val) { sem_init(sem, 0, val); } void semaphore_wait(sem_t *sem) { sem_wait(sem); } void semaphore_post(sem_t *sem) { sem_post(sem); } void *philosopher(void *arg) { int i = *(int *)arg; int left = i; int right = (i + 1) % N; while (1) { // thinking printf("Philosopher %d is thinking...\n", i); sleep(1); // pick up chopsticks printf("Philosopher %d is hungry and wants to eat...\n", i); semaphore_wait(&chopsticks[left]); semaphore_wait(&chopsticks[right]); // eating printf("Philosopher %d is eating...\n", i); sleep(1); // put down chopsticks semaphore_post(&chopsticks[left]); semaphore_post(&chopsticks[right]); } } int main() { int i; int id[N]; // initialize semaphores for (i = 0; i < N; i++) { init_semaphore(&chopsticks[i], 1); } // create threads for (i = 0; i < N; i++) { id[i] = i; pthread_create(&philosophers[i], NULL, philosopher, &id[i]); } // join threads for (i = 0; i < N; i++) { pthread_join(philosophers[i], NULL); } return 0; } ``` 在程序中,我们使用了线程来表示每个哲学家,使用信号量来表示筷子。在主函数中,我们首先初始化信号量,然后创建线程,最后等待线程结束。在哲学家函数中,我们使用了P、V操作来模拟哲学家吃饭的过程。 以上就是使用Linux完成“哲学家吃饭问题”的演示程序的步骤和代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

历史五千年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值