首页 > 其他分享 >多线程的并发—互斥锁(互斥量)

多线程的并发—互斥锁(互斥量)

时间:2023-03-26 17:23:03浏览次数:41  
标签:account balance 并发 double 互斥 mutex pthread 多线程 momney

//account.h

#ifndef     _ACCOUNT_H
#define     _ACCOUNT_H
#include <pthread.h>

typedef struct{
    int code;
    double balance;    
    //定义一把互斥锁,用来对多线程操作的银行账户(共享资源)进行加锁(保护)的
    
    /* 建议一把互斥锁和一个共享资源(银行账户)绑定,尽量不要设置成全局变量,否则可能出现
    一把互斥锁去锁几百个账户(即一个线程获得锁,其他线程将阻塞),导致并发性的降低 
    */
    pthread_mutex_t mutex;
}Account;

//创建账户
extern Account *create_account(int code, double balance);

//销毁账户
extern void destroy_account(Account *a);

//取款
extern double get_momney(Account *a, double momney);

//存款
extern double save_momney(Account *a, double momney);

//获得余额
extern double get_balance(Account *a);


#endif
//account.c

#include "account.h"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

//创建账户
Account *create_account(int code, double balance)
{
    Account *a = (Account *)malloc(sizeof(Account));
    if(a == NULL){
        printf("create_account failed\n");
        return (Account *)0;
    }
    
    a->code = code;
    a->balance = balance;
    if(pthread_mutex_init(&a->mutex, NULL) != 0){
        printf("pthread_mutex_init failed\n");
    }
    
    return a;
}

//销毁账户
extern void destroy_account(Account *a)
{
    if(a == NULL){
        printf("destroy_account failed\n");
    }
    
    if(pthread_mutex_destroy(&a->mutex) != 0){
        printf("pthread_mutex_destroy failed\n");
    }
    free(a);
}

//取款
extern double get_momney(Account *a, double momney)
{
    if(a == NULL){
        printf("get_momney failed\n");
    }
    
    pthread_mutex_lock(&a->mutex);
    if(momney < 0 || a->balance < momney)
    {
        printf("momney not enough\n");
        pthread_mutex_unlock(&a->mutex);
        return 0.0;
    }
    
    double balance = a->balance;
    sleep(1);
    balance = balance - momney;
    a->balance = balance;
    pthread_mutex_unlock(&a->mutex);
    
    return momney;
}


//存款
extern double save_momney(Account *a, double momney)
{
    if(a == NULL){
        printf("save_momney failed\n");
    }
    
    pthread_mutex_lock(&a->mutex);
    if(momney < 0){
        pthread_mutex_unlock(&a->mutex);
        return 0.0;
    }
    
    double balance = a->balance;
    sleep(1);
    balance = balance + momney;
    a->balance = balance;
    pthread_mutex_unlock(&a->mutex);
    
    return momney;
}


//获得余额
extern double get_balance(Account *a)
{
    if(a == NULL){
        printf("get_balance failed\n");
    }
    
    pthread_mutex_lock(&a->mutex);
    double balance = a->balance;
    pthread_mutex_unlock(&a->mutex);
    
    return balance;
}
//account_test.c

#include <stdio.h>
#include <pthread.h>
#include "account.h"
#include <string.h>
#include <stdlib.h>



/* void *memcpy(void *dest, const void *src, size_t n); */


 /* int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg); */
typedef struct{
    Account *account;
    char name[20];
    double momney;    
}operArg;

void *getmomney_fn(void *arg)
{
    operArg *o = (operArg *)arg;
    double momney = get_momney(o->account, o->momney);

    
    printf("%s from %d getmomney %f\n",o->name, o->account->code, momney);
    
    return (void *)0;
}

int main()
{    
    pthread_t boy,girl;
    
    Account *a = create_account(1001,10000);
    
    operArg o1,o2;
    o1.account = a;
    o1.momney = 10000;
    memcpy(o1.name, "boy", sizeof("boy"));
    
    o2.account = a;
    o2.momney = 10000;
    memcpy(o2.name, "girl", sizeof("girl"));
    
    if(pthread_create(&boy, NULL, getmomney_fn, (void *)&o1) < 0){
        printf("pthread_create failed\n");
        exit(1);
    }
    
    if(pthread_create(&girl, NULL, getmomney_fn, (void *)&o2) < 0){
        printf("pthread_create failed\n");
        exit(1);
    }
    
    pthread_join(boy, NULL);
    pthread_join(girl, NULL);
    
    printf("get balance = %f\n",get_balance(a));
    
    destroy_account(a);
    
    return 0;
}

 

标签:account,balance,并发,double,互斥,mutex,pthread,多线程,momney
From: https://www.cnblogs.com/zj-studyrecoding/p/17259010.html

相关文章

  • Java 并发中的设计模式
    其实在Java并发编程这个领域中,隐藏了许多的“设计模式”,并发编程的设计模式和我们常谈的“单例模式”、“工厂模式”这类“设计模式”,其实可以理解为都是对代码精良设计......
  • 多线程操作共享资源(如全局变量)原理
    CPU对变量的计算分为三个步骤:1.从内存读取变量到寄存器(如add寄存器)2.将读取到的变量进行计算3.将寄存器中计算的值写入内存 如有两个线程(线程1和线程......
  • Java多线程
    一、多线程简介 Java多线程是指在一个程序中同时执行多个线程(线程就是一条执行路径)。Java中的多线程可以提高程序的运行效率和并发性,通常用于执行一些耗时的操作或需要同......
  • golang 实现的零依赖、高性能、并发 mysqldump 工具。
    mysqldumpgolang中实现的零依赖、高性能、并发mysqldump工具。项目地址:https://github.com/dengjiawen8955/mysqldump/blob/master/README-zh.md文章地址:https:/......
  • 多线程sigpipe
    之前记录过socket读写异常相关情况,socket链接错误以及原因以及信号相关处理:多线程信号处理目前调试引擎时候出现了 错误;signalSIGPIPE,Brokenpipe一开始以为是没......
  • MongoDB官方性能测试报告:YCSB测试下的并发量提升
    1.前言MongoDB3.0的主要侧重点是提高性能,尤其是写性能和对硬件资源的利用率。为了展示我们在3.0中取得的成果和如何来应用这些新的改善,我们接下来将发布一系列博客来比较......
  • 多线程
    一、线程1、概念线程在一个进程的内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”叫做线程是操作系统能够进行运算调度的最小单位。它......
  • 亿级高并发电商项目-- 实战篇 --万达商城项目 十三(编写购物车、优化修改商品、下架商
      ......
  • 2 - 线程 - Windows 10 - CPython 解释器 - 多线程并行(实际并发)
    @目录一、线程和进程介绍进程基本概念面向线程设计的系统内部解析-用户态/内核态线程基本概念二、对进程线程并发并行的实际运行过程的理解:CPython多线程争抢GIL——......
  • 日志之MDC和异步多线程间传递线程id
    目录1MDC1.1简介1.2MDC坐标和使用1.3主要方法2多线程间使用2.1MDC工具类2.2拦截器定义和配置2.3Java线程池中使用2.3.1配置线程池2.3.2使用ExecutorCompletionSe......