新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 研友的交流园地,讨论关于计算机考研的方方面面。
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机理论与工程『 计算机考研交流 』 → [求助]操作系统,PV原语的问题 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 29787 个阅读者  浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [求助]操作系统,PV原语的问题 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     dtdnh520 帅哥哟,离线,有人找我吗?双鱼座1921-2-28
      
      
      等级:大一新生
      文章:3
      积分:66
      门派:XML.ORG.CN
      注册:2008/1/6

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给dtdnh520发送一个短消息 把dtdnh520加入好友 查看dtdnh520的个人资料 搜索dtdnh520在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看dtdnh520的博客41
    发贴心情 

    生产者和消费者的例子中对缓冲区加锁只是为了防止多个生产者或多个消费者同时去对循环队队进行读的操作,或写的操作,也就是说缓冲区是一个临界资源.
      而这题,每个门就可以当成一个临界资源,他们是相互独立的,当你想进入超市,只要随便找个门去就行,出来时,水边找个门来.所以,我是支持"九九"的看法的.
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/18 11:01:00
     
     wanginvc 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:74
      门派:XML.ORG.CN
      注册:2008/4/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wanginvc发送一个短消息 把wanginvc加入好友 查看wanginvc的个人资料 搜索wanginvc在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看wanginvc的博客42
    发贴心情 
    一名过客, 我对这个问题的理解是这样的,仅供参考,因为忙可能不会继续回复此帖,见谅-_-:
    立场不同, 问题的理解也不同.
    1. 超市客户的角度,我们需要描述购物过程(进门,购物,出门), 那么有多少个用户就会有多少个并发线程或进程. 也就是说每个用户就是一个独立的线程,他们之间需要用信号量进行同步.这应该适用用户作为已知条件的情况,比如已经知道张三,李四,王五等人的时候,他们就是我们描述的对象.
    2. 超市运行角度, 我们同样需要描述购物过程(进门,购物,出门), 但是这时只会有两个并发线程或进程, 一个客户进门购物进程和一个客户出门进程. 超市是我们的描述目标, 超市提供了这两种服务,我们需要用信号量来同步进门和出门两种服务. 本人认为, 此题适合这种情况. 下面是我提供的这种情况的解决方案:
    Semaphores:
    MarketFreeSpace: 0 ~ 500, initilized to 500
    CustomersInMarket: 0 ~ 500, initilized to 0
    DoorsAvaiable: 0 ~ 6, intilized to 6
    In:

    P(MarketFreeSpace);
    P(DoorsAvaiable);
    Shopping();
    V(CustomersInMarket);
    V(DoorsAvaiable);

    Out:
    P(CustomersInMarket);
    P(DoorsAvaiable);
    Cashing();
    V(MarketFreeSpace);
    V(DoorsAvaiable);

    附源代码:
    // Semaphore.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"
    #include "Windows.h"

    HANDLE hSemSpace;
    HANDLE hSemPeople;
    HANDLE hSemDoors;

    void InMarket(const char * threadName)
    {
     long lPrevCountPeople;
     long lPrevCountDoors;
     WaitForSingleObject(hSemSpace, INFINITE);
     WaitForSingleObject(hSemDoors, INFINITE);
     printf("%s: I am into market.\n", threadName);
     ReleaseSemaphore(hSemPeople,1, &lPrevCountPeople);
     ReleaseSemaphore(hSemDoors, 1, &lPrevCountDoors);
     printf("%s: Current %d people in market.\n", threadName, lPrevCountPeople + 1);
     printf("%s: Current %d doors opened.\n", threadName, lPrevCountDoors + 1);
    }

    void OutMarket(const char * threadName)
    {
     long lPrevCountSpace;
     long lPrevCountDoors;
     
     WaitForSingleObject(hSemPeople, INFINITE);
     WaitForSingleObject(hSemDoors, INFINITE);
     printf("%s: I am out market.\n", threadName);
     ReleaseSemaphore(hSemSpace, 1, &lPrevCountSpace);
     ReleaseSemaphore(hSemDoors, 1, &lPrevCountDoors);
     printf("%s: Current %d doors opened.\n", threadName, lPrevCountDoors + 1);
     printf("%s: Current %d free space for people in market.\n", threadName, lPrevCountSpace + 1);
    }

    DWORD WINAPI ThreadInMarket(LPVOID lpParameter)
    {
     while(TRUE)
     {
      InMarket("ThreadInMarket");
     }
     return 0;
    }

    DWORD WINAPI ThreadOutMarket(LPVOID lpParameter)
    {
     while(TRUE)
     {
      OutMarket("ThreadOutMarket");
     }
     return 0;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
     HANDLE hInMarket;
     HANDLE hOutMarket;
     DWORD dwWaitResult;
     long lPrevCount;
     setbuf(stdout, NULL);
     //Open/Create semaphore
     hSemSpace = CreateSemaphore(NULL, 1, 1, L"Space");
     if(hSemSpace == NULL)
     {
      printf("CreateSemaphore \"Space\" fail, erro code:%d\n, exit", GetLastError());
      return 0;
     }
     else
     {
      printf("CreateSemaphore \"Space\" succeeds.\n");
     }
     
     hSemPeople = CreateSemaphore(NULL, 0, 1, L"People");
     if(hSemPeople == NULL)
     {
      printf("CreateSemaphore \"People\" fail, erro code:%d\n, exit", GetLastError());
      return 0;
     }
     else
     {
      printf("CreateSemaphore \"People\" succeeds.\n");
     }

     hSemDoors = CreateSemaphore(NULL, 1, 1, L"Doors");
     if(hSemDoors == NULL)
     {
      printf("CreateSemaphore \"Doors\" fail, erro code:%d\n, exit", GetLastError());
      return 0;
     }
     else
     {
      printf("CreateSemaphore \"Doors\" succeeds.\n");
     }

     hInMarket = CreateThread(NULL, 0, ThreadInMarket, NULL, CREATE_SUSPENDED, NULL);
     hOutMarket =CreateThread(NULL, 0, ThreadOutMarket, NULL, CREATE_SUSPENDED, NULL);
     ResumeThread(hInMarket);
     ResumeThread(hOutMarket);
     while(TRUE)
     {
      Sleep(10000);
     }
     return 0;
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/28 17:51:00
     
     zhangzijun 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(数据结构考了98分!)
      文章:89
      积分:447
      门派:XML.ORG.CN
      注册:2007/9/18

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhangzijun发送一个短消息 把zhangzijun加入好友 查看zhangzijun的个人资料 搜索zhangzijun在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看zhangzijun的博客43
    发贴心情 
    呵呵,顶

    ----------------------------------------------
    北大——心中的圣地!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/5/21 16:07:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 计算机考研交流 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/6/26 10:41:23

    本主题贴数43,分页:[1] ... [2] [3] [4] [5]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    13,699.220ms