freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

生產(chǎn)者與消費(fèi)者問(wèn)題0-文庫(kù)吧在線(xiàn)文庫(kù)

  

【正文】 的指針。lInitialCount——信號(hào)量的初始值。成功執(zhí)行則返回非0值l 格式BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lppreviousCount )。l 參數(shù)說(shuō)明lpCriticalSection——指向臨界區(qū)對(duì)象的指針。設(shè)計(jì)結(jié)論和心得(1)結(jié)論:在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線(xiàn)程。 //線(xiàn)程序列號(hào) char entity。 //用于存儲(chǔ)每個(gè)線(xiàn)程句柄的數(shù)組;ThreadInfo Thread_Info[MAX_THREAD_NUM]。 bool IfInOtherRequest(int)。 //初始化每個(gè)線(xiàn)程的請(qǐng)求隊(duì)列; for(int j=0。i++) InitializeCriticalSection(amp。 inFile Thread_Info[n_Thread].entity。 !()){ inFile Thread_Info[n_Thread].thread_request[Thread_Info[n_Thread].n_request++]。 printf( \n thread%2d %c %f ,Temp_serial,Temp_entity,Temp_delay)。 h_mutex = CreateMutex(NULL,FALSE,mutex_for_update)。 } h_Semaphore[j+1]=CreateSemaphore(NULL,0,n_Thread,())。(Thread_Info[i]),0,NULL)。jThread_Info[i].n_request。 break。}//生產(chǎn)者進(jìn)程void Produce(void *p){ //局部變量聲明; DWORD wait_for_semaphore,wait_for_mutex,m_delay。 int ProducePos = FindProducePosition()。}//消費(fèi)者進(jìn)程void Consume(void * p){ //局部變量聲明; DWORD wait_for_semaphore,m_delay。i++) m_thread_request[i] = ((ThreadInfo*)(p))thread_request[i]。PC_Critical[BufferPos])。 }//離開(kāi)臨界區(qū) LeaveCriticalSection(amp。由于 eip 已經(jīng)被替換為指向信號(hào)句柄,因此,此刻即會(huì)立即執(zhí)行用戶(hù)自定義的信號(hào)處理程序。信號(hào)機(jī)制提供了一種處理異步事件的方法。 signal()和 sigaction()的功能比較類(lèi)似,都是更改信號(hào)原處理句柄(handler ,或稱(chēng)為處理程序)。 在 include/ 文件中(第 45 行起),默認(rèn)句柄 SIG_DFL 和忽略處理句柄 SIG_IGN 的定義是: define SIG_DFL define SIG_IGN ((void (*)(int))0) ((void (*)(int))1) 都分別表示無(wú)返回值的函數(shù)指針,與 signal()函數(shù)中第二個(gè)參數(shù)的要求相同。 void sig_handler(int signr) // 信號(hào)句柄。 其中參數(shù) sig 是我們需要查看或修改其信號(hào)處理句柄的信號(hào),后兩個(gè)參數(shù)是 sigaction 結(jié)構(gòu)的指針。 // 信號(hào)選項(xiàng)標(biāo)志。從而在我們處理一指定信號(hào)期間能確保阻塞同一個(gè)信號(hào)而不讓其丟失,直到此次處理完畢。 do_signal()函數(shù)是內(nèi)核系統(tǒng)調(diào)用(int 0x80)中斷處理程序中對(duì)信號(hào)的預(yù)處理程序。 1011 include // 信號(hào)頭文件。返回值是原信號(hào)屏蔽 位圖。 // 驗(yàn)證 to 處的內(nèi)存是否足夠。 36 to++。為指定的信 號(hào)安裝新的信號(hào)句柄(信號(hào)處理程序)。 54 = (void (*)(int)) handler。 58 handler = (long) currentsigaction[signum1].sa_handler。成功則 返回 0,否則為1。 73 if (oldaction) 74 save_old((char *) amp。 // 該段代碼的主要作用是將信號(hào)的處理句柄插入到用戶(hù)程序堆棧中,并在本系統(tǒng)調(diào)用結(jié)束 // 返回后立刻執(zhí)行信號(hào)句柄程序,然后繼續(xù)執(zhí)行用戶(hù)的程序。 // 如果信號(hào)句柄為 SIG_IGN(忽略),則返回;如果句柄為 SIG_DFL(默認(rèn)處理),則如果信號(hào)是 // SIGCHLD 則返回,否 則終止進(jìn)程的執(zhí)行 94 if (sa_handler==1) 95 return。因此在本次系統(tǒng)調(diào)用中斷(0x80)返回用戶(hù)程序時(shí)會(huì)首先執(zhí)行用戶(hù)的信號(hào)句柄程序,然后 // 再繼續(xù)執(zhí)行用戶(hù)程序。 // 將原調(diào)用程序的用戶(hù)堆棧指針向下擴(kuò)展 7(或 8)個(gè)長(zhǎng)字(用來(lái)存放調(diào)用信號(hào)句柄的參數(shù)等), // 并檢查內(nèi)存使用情況(例如如果內(nèi)存超界則分配新頁(yè)等)。 111 if (!(sasa_flags amp。 // 進(jìn)程阻塞碼(屏蔽碼)添上 sa_mask 中的碼位。 115 put_fs_long(edx,tmp_esp++)。 // 在用戶(hù)堆棧中從下到上存放 sa_restorer, 信號(hào) signr, 屏蔽碼 blocked(如果 SA_NOMASK 置位), // eax, ecx, edx, eflags 和用戶(hù)程序原代碼指針。 // 如果允許信號(hào)自己的處理句柄收到信號(hào)自己,則也需要將進(jìn)程的阻塞碼壓入堆棧。 101 } // 如果該信號(hào)句柄只需使用一次,則將該句柄置空(該信號(hào)句柄已經(jīng)保存在 sa_handler 指針中)。 //currentsigaction[signu1]。 SA_NOMASK) 76 currentsigaction[signum1].sa_mask = 0。 // 在信號(hào)的 sigaction 結(jié)構(gòu)中設(shè)置新的操作(動(dòng)作)。改變進(jìn)程在收到一個(gè)信號(hào)時(shí)的操作。 56 = SA_ONESHOT | SA_NOMASK。 // 函數(shù)返回原信號(hào)句柄。 i sizeof(struct sigaction) 。 // 復(fù)制到 fs 段。 25 return old。 14// 獲取當(dāng)前任務(wù)信號(hào)屏蔽位圖(屏蔽碼)。 8 include linux/ // 內(nèi)核頭文件。signal()函數(shù)會(huì)在一處理句柄結(jié)束后將其恢復(fù)成信號(hào)的默認(rèn)處理句柄。 當(dāng)修改對(duì)一個(gè)信號(hào)的處理方法時(shí),如果處理句柄 sa_handler 不是默認(rèn)處理句柄 SIG_DFL 或忽略處理句柄 SIG_IGN,那么在 sa_handler 處理句柄可被調(diào)用前,sa_mask 字段就指定了需要加入到進(jìn)程信號(hào)屏蔽位圖中的一個(gè)信號(hào)集。 // 信號(hào)處理句柄。 // 主程序中設(shè)置自己的信號(hào)處理句柄。 當(dāng)一個(gè)程序被執(zhí)行時(shí),系統(tǒng)會(huì)設(shè)置其處理所有信號(hào)的方式為 SIG_DFL 或 SIG_IGN。一個(gè)指定需要捕獲的信號(hào) signr;另外一個(gè)是新的信號(hào)處理函數(shù)指針(新的信號(hào)處理句柄)void (*handler)(int)。例如使用 kill()函數(shù)向同組的子進(jìn)程發(fā)送終止執(zhí)行信號(hào)。最后通過(guò) sa_restorer 的 ret 指令彈出原用戶(hù)程序的 eip(也即堆棧上的 old_eip),返回去執(zhí)行用戶(hù)程序。由該函數(shù)負(fù)責(zé)清理在信號(hào)處理程序執(zhí)行完后恢復(fù)用戶(hù)程序的寄存器值和系統(tǒng)調(diào)用返回值,就好象沒(méi)有運(yùn)行過(guò)信號(hào)處理程序,而是直接從系統(tǒng)調(diào)用中返回的。 //標(biāo)記緩沖區(qū)為空; printf(Consumer%2d finish consuming %2d:\n ,m_serial,m_thread_request[i])。i++){ //請(qǐng)求消費(fèi)下一個(gè)產(chǎn)品 printf(Consumer %2d request to consume %2d product\n,m_serial,m_thread_request[i])。 m_delay = (DWORD)(((ThreadInfo*)(p))delay *INTE_PER_SEC)。 Buffer_Critical[ProducePos] = m_serial。 Sleep(m_delay)。in_Buffer_or_Critical。 for (int i =0。 return 0。P39。 int temp =j。k++) printf( %d , Thread_Info[j].thread_request[k])。j
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1