C++不用同步机制实现卖货程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/89278565

一 需求说明

伙计在卖商品时,每次卖出50元的货物就会从顾客收到50元钱,老板每隔一秒钟去清点店里货物和金钱的总数,看总数有没有变少。

二 不用线程同步设计方法

可以创建两个线程,一个线程代表伙计卖货收线这个事务,另外一个线程模拟老板的对账事务,也就是一个线程对全局变量进行写操作,另外一个线程对全局变量进行读操作。

三 代码

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int a = 200;   //代表货物的价值,也就是有200元的货物
int b = 100;   //代码金钱的价值,也就是由100元金钱
void* ThreadA(void*)    //模拟伙计卖货收钱的过程
{
    while (1)
    {
        a -= 50; //卖出价值50元的货物
        b += 50;//收回50元钱
    }
}
void* ThreadB(void*)    //模拟老板对账
{
    while (1)
    {
        printf("%d\n", a + b);   //打印货物和现金的总和
        sleep(1);      //每隔1秒检查一次
    }
}
int main()
{
    pthread_t tida, tidb;
    pthread_create(&tida, NULL, ThreadA, NULL);  //创建卖货线程
    pthread_create(&tidb, NULL, ThreadB, NULL);  //创建老板对账线程
    pthread_join(tida, NULL);  //等待线程结束
    pthread_join(tidb, NULL);  //等待线程结束
    return 1;
}

四 运行

[root@localhost test]# g++ -o test test.cpp -lpthread
[root@localhost test]# ./test
300
300
250
300
250
300
250
250
^C

五 程序说明

这个例子中,线程B每隔1秒检查一下当前现金和货物的总和是否是300,但打印来看,还是出现了打印250的现象,这是因为伙计在卖货和收钱之间被老板的对账线程打断了。

解决该问题的方法是互斥锁。

六 临界资源和临界区的概念

临界资源:是一次仅允许一个线程使用共享资源,各个线程应该互斥地访问临界资源。

临界区:每个线程中访问临界资源的那段代码称为临界区,又称临界段。因为临界资源要求每个线程互斥地对其访问,所以每次只允许一个线程进入临界区,进入后其他线程不允许再进入,一直要等到临界区中的线程退出。

七 线程进入临界区需要遵循的原则

1 如果有若干线程要求进入空闲临界区,一次仅允许一个线程进入。

2 任何时候,处于临界区的线程不可多余一个,若已有线程进入自己的临界区,则其他所有试图进入临界区的进程必须等待。

3 进入临界区的线程要在有限的时候内退出,以便其他线程能及时进入自己的临界区。

4 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/89278565
今日推荐