亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 設計報告.txt

?? 主要功能: 1、 包括顧客信息、貨品信息、定單信息的管理。 2、 按月統計銷售業績。 3、 報表設計。 4、 系統維護。
?? TXT
?? 第 1 頁 / 共 4 頁
字號:
實踐目標:
用Win32提供的同步對象解決有限緩沖區問題
實踐內容:
寫一個線程實現C/C++語言程序:一些線程負責找出某個數據范圍的素數,并放到一個數組中,另一些線程負責將數組中的素數按次序取出,并顯示出來。顯示過的數據要從數組中刪除。
要求定義一個全局變量的數組:int prime[9]用于存放找到的待顯示的素數。
三、實踐報告主要內容
設計思路:
找min和max之間素數算法
從min開始到max的每個數num,用2,3,…,sqrt(num)來除它,如果均不能整除則num為素數。
2.進程同步:生產者-消費者算法
 do{
  ……
  Produce n item in nexp
  ……
  Wait(empty);
  Wait(mutex);
  ……
  Add nexp to buffer
  ……
  Signal(mutex);
  Signal(full);
 }while(1);
3.產生和顯示素數的過程
讀寫時display和search線程均從prime的第0個元素開始(具體見程序代碼)。Prime數組的元素為0即表明沒有寫入,非0即為已寫入。search線程從下標0開始存放找到的素數,存放前先判斷prime[i]是否為0,為0則存放新找到的素數,否則循環;display線程從下標0開始顯示數組中存放的素數,顯示時先判斷prime[i]是否為0,不為0則顯示該素數,并將prime[i]賦0,否則循環。
整數searchCount和displayCount用于記錄display線程和search線程開啟的個數,以便保證display線程顯示素數和find線程存放素數不會發生死鎖,每次測試時分別將它們初始化為0。主要數據結構:
線程信息結構體:
struct ThreadInfo
{
 int   serial;   //ID
 char  command;  //命令
 int   num_from;  //起始數或顯示數
 int   num_to;   //結束數
};
int searchCount = 0;  //search線程數
int displayCount = 0;  //display線程數
CRITICAL_SECTION  my_section;  //臨界區
int prime[9];
主要代碼分析:
詳見代碼注釋。
四、實踐結果
基本數據:
 
源程序代碼行數 完成實踐投入的總時間 資料查閱時間 編程調試時間 源程序文件    
354 4小時 1小時 3小時 ex4.cpp  
測試數據設計:
“ex4.dat”文件內容如下:
1.
 1  w  10  100
2  w  1  10
3  d  3   0
測試結果分析:
對應于數據2的運行結果圖如下所示:
Reader Priority:

Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 2 begins to write the date .
Search thread 2 finish writing the date .
Search thread 2 begins to write the date .
Search thread 2 finish writing the date .
Search thread 2 begins to write the date .
Search thread 2 finish writing the date .
Display thread 3 begins to output prime num .
----------Display thread 3 output the prime num "11".
Display thread 3 finishes outputting prime num .
Display thread 3 begins to output prime num .
----------Display thread 3 output the prime num "13".
Display thread 3 finishes outputting prime num .
Display thread 3 begins to output prime num .
----------Display thread 3 output the prime num "17".
Display thread 3 finishes outputting prime num .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
Search thread 1 begins to write the date .
Search thread 1 finish writing the date .
All search and display thread have finished Operating.
The array at last.
 29  31  37  19  23  3  5  7  41

Press any key to finish this Program.
Thank you test this Program!
程序運行過程中,線程1、線程2為找素數線程,線程3負責顯示,它們均交叉訪問臨界區,程序運行結果完全正確。
五、實踐體會
 同類線程之間的互斥以及不同類線程之間的同步需要通過兩組互斥對象來解決,我在這個問題的處理上采用了semaphore和critical_section這兩種對象來完成這個任務。
 實踐中遇到了比較大的困難:
1. 沒有處理死鎖的情況
 死鎖情況有兩種,display線程過多導致不夠顯示,search線程過多導致不夠寫入,在這個問題上,我沒采用等待超時的方法,而是用了全局變量來記錄開啟的線程數加上數據上的判斷來避免死鎖。
沒有將handle close導致沒有清空
當程序第二次運行時會出現莫名的錯誤,尋找了好久,才發現沒有把申請的HANDLE close掉。
 通過這個程序的實踐,掌握了semaphore的使用以及mutex的使用。
六、參考文獻
1、MSDN
2、《操作系統概念(第六版 影印版)》,Abraham Silberschatz、Peter Baer Galvin、Greg Gagne,
高等教育出版社

附:源程序代碼
#include <windows.h>
#include <conio.h>
#include <fstream.h>
#include <stdio.h>
#include <math.h>
#define INTE_PER_SEC  1000
#define MAX_THREAD_NUM  64
#define MAX_FILE_NUM  32
#define MAX_STR_LEN  32
int searchCount = 0;
int displayCount = 0;
CRITICAL_SECTION  my_section;
struct ThreadInfo
{
 int   serial;
 char  command;
 int   num_from;
 int   num_to;
};
int prime[9];
void GetCommand( char* file );
void thd_display(void* p);
void thd_search(void* p);
BOOL IsPrime(int num);
int  GetUsed(int num[9]);
////////////////////////////////////////////////////////
// main function
////////////////////////////////////////////////////////
int main( int agrc, char* argv[] )
{
 char ch;
 while ( TRUE )
 {
  // Clear screen
  system( "cls" );
  // display prompt info
  printf("*********************************************\n");
  printf("       1.Test for prime number search and display\n");
  printf("       2.Exit to Windows\n");
  printf("*********************************************\n");
  printf("Input your choice(1or2): ");
  // if the number inputed is error, retry!
  do
  {
   ch = (char)_getch();
  }while ( ch != '1' && ch != '2');

  system ( "cls" );
  if ( ch == '1')
   GetCommand("ex4.dat");
  else if ( ch == '2')
   return 0;
  printf("\nPress any key to finish this Program. \nThank you test this Program!\n");
  _getch();
 } //end while
} //end main
BOOL IsPrime(int num)
{
 int i=0;
 if (num<2)
 {
  return FALSE;
 }
 for (i=2;i<=sqrt(num)+1;i++)
 {
  if (num % i == 0)
  {
   return FALSE;
  }
 }
 return TRUE;
}
int GetUsed(int num[9])
{
 int i,count=0;
 for(i=0;i<9;i++)
 {
  if(num[i]!=0)
   count++;
 }
 return count;
}
void GetCommand( char* file )
{
 DWORD n_thread = 0;
 DWORD thread_ID;
 DWORD wait_for_all;
 int i;
// Tread Object Array
 HANDLE h_Thread[MAX_THREAD_NUM];
 ThreadInfo  thread_info[MAX_THREAD_NUM];
 searchCount = 0; //init search thread count
 displayCount = 0; //init display thread count
 InitializeCriticalSection(&my_section);  //init critical section
 memset(prime,0,sizeof(prime));
 ifstream  inFile;
 inFile.open(file);  //open file
 printf( "Reader Priority:\n\n" );
 while ( inFile )
 {
  // read every reader/writer info
  inFile>>thread_info[n_thread].serial;
  inFile>>thread_info[n_thread].command;
  inFile>>thread_info[n_thread].num_from;
  inFile>>thread_info[n_thread++].num_to;
  inFile.get();
 } //end while
 for ( i = 0; i < (int)(n_thread); i++)
 {
  if(thread_info[i].command == 'W' || thread_info[1].command == 'w')
  {
   searchCount++;
  }
  else if(thread_info[i].command == 'D' || thread_info[1].command == 'd')
  {
   displayCount++;
  }
 }
/* create semaphore */
 HANDLE h_semaphore_f = CreateSemaphore(NULL, 0, 9, "Full"); 
 HANDLE h_semaphore_e = CreateSemaphore(NULL, 9, 9, "Empty");
 for ( i = 0; i < (int)(n_thread); i++)
 {
  
  if(thread_info[i].command == 'W' || thread_info[1].command == 'w')
  {
   // Create Writer thread
   h_Thread[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(thd_search), &thread_info[i], 0, &thread_ID);
  }
  else if (thread_info[i].command == 'D' || thread_info[1].command == 'd')
  {
   // Create Reader thread
   h_Thread[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(thd_display), &thread_info[i], 0, &thread_ID);
  }
 } //end for
// waiting all thread will been finished
 wait_for_all = WaitForMultipleObjects(n_thread,h_Thread,TRUE, -1);
 printf("All search and display thread have finished Operating.\n");
//output the array at last
 printf("The array at last.\n");
 for (i=0;i<9;i++)
 {
  printf(" %d ",prime[i]);
 }
 printf("\n");
 CloseHandle(h_semaphore_f);
 CloseHandle(h_semaphore_e);
}// end GetCommand
void thd_display(void* p)
{
//semaphore
 HANDLE h_S_Full   = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Full");
 HANDLE h_S_Empty  = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Empty");
//local var
 int m_disnum;
 int m_serial;
 int i,j;
 int now_used;
//get info from para
 m_serial = ((ThreadInfo*) (p)) -> serial;
 m_disnum = ((ThreadInfo*) (p)) -> num_from;
// begin display
 for (i=0;i<m_disnum;i++)
{ 
  now_used=GetUsed(prime);
  if(searchCount==0 && now_used == 0)
  {
   break;
  }
//wait semaphore
  WaitForSingleObject(h_S_Full, INFINITE);
//enter critical section
  EnterCriticalSection( &my_section );
  printf("Display thread %d begins to output prime num .\n",m_serial);
  for (j=0;j<9;j++)
  {
   if(prime[j]!=0)
   {
    printf("----------Display thread %d output the prime num \"%d\".\n",m_serial,prime[j]);
    prime[j]=0;
    break;
   }
  }
  printf("Display thread %d finishes outputting prime num .\n",m_serial);
//leave critical section
  LeaveCriticalSection( &my_section );
//release resource
  ReleaseSemaphore(h_S_Empty, 1, NULL);
  now_used=GetUsed(prime);
  if(searchCount==0 && now_used == 0)
  {
   break;
  }
 }
//change the count of display thread
 CloseHandle(h_S_Full);
 CloseHandle(h_S_Empty);
 displayCount--; 
}
void thd_search(void* p)
{
//semaphore
 HANDLE h_S_Full   = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Full");
 HANDLE h_S_Empty  = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Empty");
//local var
 DWORD n_from;
 DWORD n_to;
 int m_serial;
 int i,j;
 int primenum[100];
 int primecount=0;
 int now_used;
//get info from para
 m_serial = ((ThreadInfo*) (p)) -> serial;
 n_from  = ((ThreadInfo*) (p)) -> num_from;
 n_to  = ((ThreadInfo*) (p)) -> num_to;
//get the primenum to write 
 for (i=n_from;i<= (int) n_to;i++)
 {
  if(IsPrime(i)==TRUE)
  {
   primenum[primecount++]=i;
  }
 }
//begin the search
 for (i=0;i<primecount;i++)
 {
  now_used=GetUsed(prime);
  if(displayCount==0 && now_used==9)
  {
   break;
  }
//wait semaphore
  WaitForSingleObject(h_S_Empty, INFINITE);
//enter critical section
  EnterCriticalSection( &my_section );
  printf("Search thread %d begins to write the date .\n",m_serial);
  for(j=0;j<9;j++)
  {
   if (prime[j]==0)
   {
    prime[j]=primenum[i];
    break;
   }
  }
  printf("Search thread %d finish writing the date .\n",m_serial);
//leave critical section
  LeaveCriticalSection( &my_section );
//release resource  
  ReleaseSemaphore(h_S_Full, 1, NULL);
  now_used=GetUsed(prime);
  if(displayCount==0 && now_used==9)
  {
   break;
  }
 }
//change the count of search thread
 CloseHandle(h_S_Full);
 CloseHandle(h_S_Empty);
 searchCount--;

}

任務五  同步對象實現P、V操作

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区视频| 欧美成人精品福利| 亚洲欧美成aⅴ人在线观看| 高清不卡一二三区| 久久精品一区二区| 国产精品一区三区| 久久综合久久99| 国产在线精品一区二区不卡了| 678五月天丁香亚洲综合网| 香蕉成人啪国产精品视频综合网| 欧美午夜电影在线播放| 亚洲一区二三区| 欧美亚洲一区三区| 亚洲一二三四区| 欧美色涩在线第一页| 亚洲第一综合色| 在线成人午夜影院| 美女爽到高潮91| 久久免费美女视频| 成人免费毛片aaaaa**| 中文字幕av一区二区三区免费看| 高清av一区二区| 亚洲色图一区二区| 欧美日韩亚洲综合在线 | 婷婷国产在线综合| 51精品秘密在线观看| 理论片日本一区| 久久久影院官网| 波多野结衣在线一区| 欧美美女直播网站| 国产成人综合网| av成人免费在线| 欧美人成免费网站| 另类小说一区二区三区| 国产亚洲欧美中文| av激情综合网| 午夜欧美一区二区三区在线播放| 欧美一级视频精品观看| 国产在线一区二区综合免费视频| 2017欧美狠狠色| proumb性欧美在线观看| 亚洲在线成人精品| 日韩三级在线观看| 国产福利一区二区| 亚洲欧美成aⅴ人在线观看| 欧美猛男gaygay网站| 韩国三级中文字幕hd久久精品| 中文字幕va一区二区三区| 在线视频欧美区| 毛片av一区二区| 中文字幕日韩一区二区| 欧美日韩在线亚洲一区蜜芽| 激情综合五月天| 亚洲少妇30p| 91精品国产一区二区人妖| 国产成人啪免费观看软件| 一区二区三区免费| 欧美xxxxx牲另类人与| aaa亚洲精品| 日韩成人免费看| 国产午夜精品福利| 在线视频亚洲一区| 国产伦精品一区二区三区在线观看| 日韩美女精品在线| 日韩亚洲欧美高清| 91社区在线播放| 久久99久久精品| 亚洲男同性视频| 精品久久久久久无| 欧美在线免费观看亚洲| 国产精品一区二区三区99| 亚洲一区免费视频| 欧美国产精品一区| 日韩一级片网址| 99re8在线精品视频免费播放| 成人av集中营| 欧美a级一区二区| 亚洲男女一区二区三区| 日韩欧美亚洲另类制服综合在线| 91在线观看地址| 韩国理伦片一区二区三区在线播放| 一区二区日韩av| 国产欧美日韩精品一区| 欧美喷水一区二区| 99久久精品一区二区| 国产在线精品免费| 婷婷久久综合九色综合伊人色| 国产精品久久久久一区二区三区共| 欧美一区二区三区男人的天堂| 色综合色综合色综合色综合色综合 | 色悠悠亚洲一区二区| 国产毛片精品视频| 日韩精品国产精品| 一区二区三区在线视频免费 | 国产精品情趣视频| 欧美成人午夜电影| 欧美精品视频www在线观看| 91啪在线观看| 成人激情开心网| 国产在线精品一区二区| 蜜乳av一区二区三区| 亚洲成人一区在线| 亚洲人吸女人奶水| 国产精品久久久久久久久搜平片 | 一区二区三区中文免费| 中文字幕av免费专区久久| 337p日本欧洲亚洲大胆精品| 欧美高清一级片在线| 在线观看av一区| 色婷婷国产精品久久包臀| 成人免费毛片a| 国产成人精品免费| 国产一区二区三区黄视频| 奇米一区二区三区av| 天天影视涩香欲综合网| 亚洲第一精品在线| 亚洲国产精品久久人人爱蜜臀| 亚洲欧美日韩在线| 日韩毛片视频在线看| 中文字幕一区二区三区视频| 国产精品色哟哟| 亚洲国产精品v| 国产精品少妇自拍| 国产精品美日韩| 国产精品久久久久久久午夜片| 欧美国产精品v| 日本一二三不卡| 国产精品成人一区二区艾草| 国产欧美一区二区精品久导航| 久久久久久黄色| 国产女人aaa级久久久级 | 中文无字幕一区二区三区| 久久精品网站免费观看| 久久99精品国产麻豆婷婷| 国内成+人亚洲+欧美+综合在线| 精品一二线国产| 国产麻豆精品在线观看| 国产精品99久久久久久宅男| 国产成人a级片| 成人午夜在线视频| eeuss影院一区二区三区| 91尤物视频在线观看| 欧日韩精品视频| 7777精品伊人久久久大香线蕉完整版| 91精品国产色综合久久久蜜香臀| 欧美一二三区在线| 久久综合久久鬼色| 亚洲国产精品激情在线观看| 亚洲三级久久久| 亚洲国产精品久久不卡毛片 | 韩日欧美一区二区三区| 精品一区二区三区蜜桃| 成人深夜福利app| 一本一道综合狠狠老| 欧美精品第一页| 欧美精品一区二区三区久久久| 国产日韩av一区| 亚洲欧美日韩国产手机在线 | 九九视频精品免费| 成人午夜电影网站| 色88888久久久久久影院野外 | 91精品中文字幕一区二区三区| 欧美电视剧免费全集观看| 国产网站一区二区三区| 亚洲三级电影网站| 日韩电影网1区2区| 国产福利精品一区| 91网上在线视频| 欧美精品xxxxbbbb| 国产亚洲人成网站| 亚洲综合自拍偷拍| 麻豆精品精品国产自在97香蕉| 国产成人av电影在线观看| 91国产丝袜在线播放| 日韩一区二区精品在线观看| 国产欧美日韩精品a在线观看| 亚洲精品伦理在线| 另类小说欧美激情| 91小视频在线免费看| 欧美一区二区网站| 国产欧美一区二区精品仙草咪| 亚洲一区二区三区自拍| 紧缚奴在线一区二区三区| 色综合天天天天做夜夜夜夜做| 欧美一区二区在线免费播放 | 日韩免费电影一区| 国产精品毛片久久久久久| 三级不卡在线观看| 成人一级黄色片| 欧美精品 国产精品| 中文字幕av免费专区久久| 日韩电影免费在线看| a级高清视频欧美日韩| 欧美一区二区三区色| 国产精品第五页| 激情综合五月婷婷| 欧美亚洲国产一卡| 国产精品无人区| 开心九九激情九九欧美日韩精美视频电影 | 一区二区三区波多野结衣在线观看 |