大神帮忙看看下面多线程中关于锁的使用存在的问题

问题描述

大神帮忙看看下面多线程中关于锁的使用存在的问题
 #include <stdio.h>
#include <process.h>
#include <windows.h>
#include <string>

class IAnimalActionObserver
{
public:
    IAnimalActionObserver(){}
    virtual ~IAnimalActionObserver(){}
    virtual void OnAnimalEat() = 0;
};

class Animal
{
public:
    Animal()
        : observer_(NULL)
    {
        _beginthreadex(NULL, 0, ThreadFun, this, 0, NULL);
    }
    virtual ~Animal(){}

    virtual void RegsiterActionObserver(IAnimalActionObserver* observer)
    {
        observer_ = observer;
    }
    virtual void DeregsiterActionObserver()
    {
        observer_ = NULL;
    }

private:
    static unsigned int _stdcall ThreadFun(void* args)
    {
        (static_cast<Animal*>(args))->ThreadLoop();
        return 0;
    }
    void ThreadLoop()
    {
        while (true)
        {
            if (observer_)
            {
                observer_->OnAnimalEat();
            }
            Sleep(2 * 1000);
        }
    }

private:
    IAnimalActionObserver* observer_;
};

class Cat
    : public IAnimalActionObserver
{
    struct CatInfo
    {
        CatInfo():eat_count_(0){}
        int eat_count_;
        std::string str_msg_;
    };
public:
    Cat()
    {
        InitializeCriticalSection(&cs_);
        _beginthreadex(NULL, 0, ThreadFun1, this, 0, NULL);
        _beginthreadex(NULL, 0, ThreadFun2, this, 0, NULL);
    }
    virtual ~Cat()
    {

    }

    virtual void OnAnimalEat()
    {
        printf("cat eat a fish.n");
        EatFinish();
    }

private:
    static unsigned int _stdcall ThreadFun1(void* args)
    {
        (static_cast<Cat*>(args))->ThreadLoop1();
        return 0;
    }
    void ThreadLoop1()
    {
        while (true)
        {
            animal_.RegsiterActionObserver(this);
            Sleep(2 * 1000);
            animal_.DeregsiterActionObserver();
            msg_.str_msg_ = "cat eating fishn";
            msg_.eat_count_++;
            if (msg_.eat_count_ >= 5)
            {
                break;
            }
        }
    }
    static unsigned int _stdcall ThreadFun2(void* args)
    {
        (static_cast<Cat*>(args))->ThreadLoop2();
        return 0;
    }
    void ThreadLoop2()
    {
        while (true)
        {
            EnterCriticalSection(&cs_);
            if (msg_.eat_count_ >= 5)
            {
                msg_.str_msg_ = "cat eat finishn";
                EatFinish();
                break;
            }
            LeaveCriticalSection(&cs_);
        }
    }
    void EatFinish()
    {
        EnterCriticalSection(&cs_);
        if (msg_.eat_count_ >= 5)
        {
            printf(msg_.str_msg_.c_str());
            msg_.eat_count_ = 0;
            msg_.str_msg_.empty();
            animal_.DeregsiterActionObserver();
        }
        LeaveCriticalSection(&cs_);
    }

private:
    Animal animal_;
    CRITICAL_SECTION cs_;
    CatInfo msg_;
};

int main()
{
    Cat cat_;
    while (1)
    {
        Sleep(1000);
    }
    return 0;
}
时间: 2024-10-04 17:42:15

大神帮忙看看下面多线程中关于锁的使用存在的问题的相关文章

线程并发 数据读写-求大神帮忙,c#多线程问题

问题描述 求大神帮忙,c#多线程问题 需求: 调用一个方法读数据,方法已经写好了,然后将读出的数据写入本地文件,可以是txt, 总共5个字段或者说属性参数. 因为要两个线程并发,边读边存,大体怎么搞,给点伪代码也行啊 多谢 解决方案 本地文件是没有等待的,同一个线程读写就可以了.两个线程做什么? 解决方案二: 用waithandle同步下 代码参考https://msdn.microsoft.com/zh-cn/library/system.threading.waithandle(VS.80)

求大神帮忙 MySQL 去掉数据库中重复的数据,保留一条

问题描述 求大神帮忙 MySQL 去掉数据库中重复的数据,保留一条 解决方案 mysql中删除两条重复的数据,只保留一条mysql 删除重复数据只保留一条mysql删除重复数据只保留一条 解决方案二: 菜鸟的答复: ** 删除前先备份一下,万一错了,我不管 ** /* 假设你的表叫table_car */ DELETE FROM table_car WHERE car_id NOT IN (SELECT MIN(car_id) FROM table_car GROUP BY car_line_i

数组-急求大神帮忙啊!matlab中遇到的矩阵变量问题

问题描述 急求大神帮忙啊!matlab中遇到的矩阵变量问题 v=[ ];x=[ ];a=[ ]; f=[ ];g=[ ];b=[ ];w=[ ];u=[ ];gg0=[ ];可以在matlab2013中这样编辑动态的数组变量吗?为什么会出现以下错误呢 The size of the indicated variable or array appears to be changing with each loop iteration. Commonly, this message appears

求大神帮忙,在gridcontrol中,选中某一行时改变该行的背景色

问题描述 求大神帮忙,在gridcontrol中,选中某一行时改变该行的背景色 求大神帮忙,在gridcontrol中,选中某一行时改变该行的背景色 ,我就5个C币 ,全拿出来了 解决方案 用什么?js?,jq?,ext? 当你选中一行触发一个函数,function getRow(rowIndex){ //改变背景色就行了. 如果你不嫌麻烦,在grid每行上做一个点击事件,点击这行,添加一个addclass也行. 解决方案二: $(该行).css("background-color",

url怎么获得 球大神帮忙

问题描述 url怎么获得 球大神帮忙 微信服务号中的url从那里获得?大神帮帮忙吧 没有一点头绪 是不是需要我自己 建立一个网站才可以阿 解决方案 如果你有公网IP可自己架设服务器,或者使用BAE或者SAE,可上网搜下,BAE的收费貌似是每天几毛钱,SAE貌似现在送豆子基本等于免费. 解决方案二: 对,你需要建立一个网站,架设一个网站简单且收费不高.推荐腾讯云.阿里云或者世纪互联. 解决方案三: 写一个接口本地代理映射80端口测试即可用

html5 css3 像素 布局-求大神帮忙解决一下有关web像素问题

问题描述 求大神帮忙解决一下有关web像素问题 今天老师讲解有关CSS3字体样式的像素问题,不过没有太明白,希望各位学长能够帮我详细指导有关字体像素的问题. 解决方案 http://www.w3cplus.com/css3/define-font-size-with-css3-rem 解决方案二: C#程序集问题,请高手帮忙解决一下!!求大神帮忙解决一下--项目中的工单同步功能怎么实现?

ajax jquer...-ajax post问题,求大神帮忙解决

问题描述 ajax post问题,求大神帮忙解决 求大神帮忙解析这个api 中的cookies,默认phone_number为123456,password 为123456 解决方案 $.post("http://api.iotfuns.net/login", { phone_number:"123456", password:"123456" }, function(data){ alert($.cookie("USER")

大神帮忙,java调用sqlplus之后,如何实现多线程

问题描述 大神帮忙,java调用sqlplus之后,如何实现多线程 1.java调用sqlplus将数据库信息写入本地sql文件(我用的是spool命令将数据库download到本地) 2.在java环境中使用这个本地sql文件, 即上述2个步骤在一个main函数中完成. 我在实际操作中,第二步操作报的错是找不到这个本地sql文件,我猜想可能是第一步没完成的时候,第二步已经开始执行,所以我想用多线程并发. 我将上面2个步骤用2个进程thread1,thread2,因为步骤2必须等步骤1结束才能执

各位大神帮忙看下一个JAVA多线程问题

问题描述 各位大神帮忙看下一个JAVA多线程问题 public class ttt { public static void main(String args[]) { account a=new account(); person person1=new person(); person person2=new person(); person1.cunkuanjine=1000; person2.cunkuanjine=2000; person1.zhanghu=a; person2.zha