1. 程式人生 > >網路程式設計(46)—— windows核心物件的兩種狀態

網路程式設計(46)—— windows核心物件的兩種狀態

一、 什麼是核心物件?

        我們知道程序、執行緒、檔案、互斥、訊號量這些都是作業系統級別的資源。我們在使用這些資源時,實際上都是由作業系統進行建立和管理的。作業系統為了管理這些資

源,會在其內部建立一個數據塊,也可以理解為一個結構體物件。這個資料塊就是核心物件。

二、 核心物件有哪兩種狀態?

        核心物件的狀態共有兩種:signaled(有訊號)狀態和non-signaled(無訊號)狀態。以執行緒為例:當一個執行緒正在執行時,管理它核心物件處於non-signaled狀態;而當線

程結束執行時,管理它的核心物件將處於signaled狀態。

三、 核心物件的兩種模式

Auto-reset模式 —— 當發生了某事件(如執行緒結束),核心物件進入signaled狀態後,我們呼叫WaitForSingleObjec返回後,核心物件會自動進入non-signaled狀態,核心物件的

這種模式就叫做auto-reset模式。

Manual-reset 模式 —— 當核心物件進入signaled狀態後,WaitForSingleObjec返回,核心物件也不會自動進入non-signaled狀態,除非我們手動將其設定為non-signaled狀態,它

的的這種模式叫做manual-reset模式。

四、 獲取核心物件狀態的兩個API

        我們可利用WaitForSingleObject和WaitForMultipleObjects來獲取核心物件的狀態,如果這兩個是阻塞函式,如果所監視的核心物件狀態為signaled時,函式將會返回。下面

是WaitForSingleObject的函式原型:

DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);

hHandle —— 表示要監視的執行緒、事件等核心物件管理的資源的Handle值。

dwMilliseconds —— 設定等待超時,單位是毫秒。如果設定成INFINITE表示一直等到核心物件狀態變成signaled為止。

函式返回值 —— 若核心物件變成signaled狀態,函式返回WAIT_OBJECT_0;若等待超時,函式返回WAIT_TIMEOUT

WaitForMultipleObjects的功能和WaitForSingleObject類似,只不過它可以同時等待多個核心物件狀態的改變。其函式原型如下:

DWORD WINAPI WaitForMultipleObjects(
__in DWORD nCount,
__in const HANDLE *lpHandles,
__in BOOL bWaitAll,
__in DWORD dwMilliseconds
);

nCount —— 等待的核心物件的個數。

lpHandles —— 存放核心物件控制代碼的陣列的首地址。

bWaitAll —— 設定是否全部等待。若為True,表示所有的核心物件變成signaled狀態後返回;若為False,表示只要有一個核心物件變成signaled 狀態即返回。

dwMilliseconds —— 設定等待超時,單位是毫秒。如果設定成INFINITE表示一直等到核心物件狀態變成signaled為止。

函式返回值 —— 若核心物件變成signaled狀態,函式返回WAIT_OBJECT_0;若等待超時,函式返回WAIT_TIMEOUT

        以下是使用WaitForMultipleObjects等待執行緒的例項。主要功能是啟動兩個執行緒,然後使用等待WaitForMultipleObjects兩個執行緒結束,最後根據WaitForMultipleObjects的返回值列印輸出執行緒是正常結束還是等待超時。

#include "stdafx.h"
#include "windows.h"
#include<process.h>

unsigned WINAPI ThreadFunc1(void* args)
{
	int i=0;
	while(1)
	{
		
		puts("ThreadFunc1 called ...");
		if(++i==5)
		{
			puts("ThreadFunc1 Ended");
			ExitThread(1);
		}
		Sleep(1000);
		
	}
}
unsigned WINAPI ThreadFunc2(void* args)
{
	int i=0;
	while(1)
	{
		puts("ThreadFunc2 called ...");
		if(++i==10)
		{
			puts("ThreadFunc2 Ended");
			ExitThread(2);
		}
		Sleep(1000);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	DWORD thredID1,thredID2;
	HANDLE handles[2];
    handles[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc1,NULL,0,&thredID1);
	handles[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc2,NULL,0,&thredID2);
	DWORD dr = WaitForMultipleObjects(2,handles,true,INFINITE);
	if(dr==WAIT_OBJECT_0)
	{
		puts("兩¢?個?內¨²核?對?象¨®都?進?入¨?signaled狀Á¡ä態¬?。¡ê");
	}
	else if(dr==WAIT_TIMEOUT)
	{
		puts("等̨¨待äy超?時º¡À。¡ê");
	}
	return 0;
}

        main函式裡,我們分別啟動了兩個執行緒,此時管理執行緒的核心物件將進入non-signaled狀態。我們呼叫WaitForMultipleObjects等待執行緒結束進入signaled狀態。當執行緒結束進入signaled狀態後,WaitForMultipleObjects返回,開始執行其後面的語句。但是由於管理執行緒的核心物件不是Auto-Reset物件,這兩個核心物件將一直保持signaled狀態。

       程式執行結果:


Github位置:https://github.com/HymanLiuTS/NetDevelopment克隆本專案:git clone [email protected]:HymanLiuTS/NetDevelopment.git獲取本文原始碼:
git checkout NL46



相關推薦

網路程式設計46—— windows核心物件狀態

一、 什麼是核心物件?         我們知道程序、執行緒、檔案、互斥、訊號量這些都是作業系統級別的資源。我們在使用這些資源時,實際上都是由作業系統進行建立和管理的。作業系統為了管理這些資 源,會在其內部建立一個數據塊,也可以理解為一個結構體物件。這個資料塊就是核心物件。

網路程式設計53—— Windows下使用WSAAsyncSelect實現視窗處理socket訊息

一、引言        上一文中我們介紹了使用WSAEventSelect實現非同步通知IO的方法,本文我們主要討論下使用WSAAsyncSelect處理socket的方法。本文的主要目標,是建立一個帶介面的回聲服務端,接收並返回客戶端傳過來的字串,並在介面上顯示該字串。為

網路程式設計55—— Windows下使用WSASocket基於Completion Routine進行IO重疊

一、引言         上一文中我們介紹了使用基於事件進行IO重疊的方法,本文主要介紹另外一種,基於回撥函式void CALLBACK CompletionRoutine(DWORD dwError,DWORDszRecvBytes,LPWSAOVERLAPPED lpO

網路程式設計52—— Windows下使用WSAEventSelect實現非同步通知IO

一、同步IO和非同步IO         同步IO是指發生IO事件的時間點和相關函式返回的時間點一致。如使用send函式傳送資料時,所有的資料傳送到輸出緩衝區後,send函式才會返回,這種IO方式就是同步IO。非同步IO指函式先於IO事件返回。還是以send函式為例,呼叫s

Windows網路程式設計:訊息選擇模型

概述 之前介紹過,系統提供了幾種網路模型用於非同步的網路互動,訊息選擇模型就是其中一種。 這種模型的使用需要在呼叫完socket()函式以後呼叫WSAAsyncSelect(),這個函式的宣告如下: int WSAAsyncSelect(SOCKET s,HWND h

Windows網路程式設計:非阻塞模式非同步模式

前面幾篇文章介紹的無論是TCP通訊還是UDP通訊都是阻塞式的,它們在執行recv或recvfrom時會線上程中等待,直到接收到資訊為止,所以在應用的時候一般都需要開闢子執行緒,在子執行緒裡專門做這類事情,不然它會影響主執行緒的執行。  系統提供三種網路模型

Windows網路程式設計:原始套接字開發

在呼叫socket()函式時,如果將第二個引數填為SOCK_RAW,代表建立的是原始套接字型別,第三個引數可以選擇IPPROTO_ICMP、IPPROTO_TCP、IPPROTO和IPPROTO_RAW。 #include <winsock2.h> #pragma co

Windows網路程式設計:IP Helper

IP Helper是Windows系統與IP配置和管理的重要介面,通過IP Helper 可以獲得很多跟網路配置相關的資訊。比如說本機IP、閘道器設定、網絡卡數量和連線資訊。 #include <windows.h> #include "iphlpapi.h" /* 全域

Windows網路程式設計:多執行緒訊息處理

對於服務端來說,呼叫accept()函式同意客戶端連線的請求後,需要處理完與這個客戶端的通訊後回到accept()繼續等待下一個客戶端的連線,如果一個客戶端請求連線時服務端並沒有在accept()處等待,客戶端是無法成功連上服務端的,因此併發客戶端連線的服務端必然是多執行緒的。 服務

Windows網路程式設計:建立UDP連線和收發訊息

UDP訊息的傳送和接收需要UDP連線,所以,上面的TCP連線已經不適用了,具體的區別主要有: 建立Socket時引數不同建立服務端時不需要listen和accept操作建立客戶端時不需要connect操作伺服器需要bind操作,客戶端不需要。 傳送和接收UDP訊息要用到sendt

Windows網路程式設計:建立TCP連線和收發訊息

先看服務端: // ConsoleApplication3.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #define _WINSOCK_DEPRECATED_NO_WARNINGS //這個宣告要在stdafx.h的後面,但要

Windows網路程式設計:Socket簡介

Socket簡介 Socket被稱為套接字,描述了IP和埠等資訊,是一個通訊鏈的控制代碼。 微軟專門開發了一套支援多種網路協議的網路程式設計介面,叫做Winsock,Winsock是Windos SDK的一部分,全稱Windows Sockets API。它對多種協議做了封裝,S

Windows網路程式設計:TCP/IP協議

概述 這個協議是一個四層協議: 應用層,主要協議有HTTP、FTP等 傳輸層,主要協議有TCP、UDP等 網路層,主要協議有IP等 鏈路層,主要協議有ICMP等 下層中的協議總是為上層中的協議服務的,比如說應用層的HTTP、FTP協議都是基於T

c++ 網路程式設計TCP/IP LINUX/windows下 多執行緒超詳細教程 以及 多執行緒實現服務端

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

c++ 網路程式設計TCP/IP LINUX/windows下 多執行緒超詳細教程 以及 多執行緒實現服務端

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大

~~核心程式設計:面向物件——封裝~~

進擊のpython 封裝 什麼是封裝呢? 在前面是不是寫過這樣的程式碼 class Dog: froom = "ch" def __init__(self, name, age, kind="erha"): self.blood =

python學習-網路程式設計

udp的接收和傳送資料程式碼: udp的傳送資料程式碼如下: import socket def main():     #建立套接字     udp_socket = socket.socket(socket.AF_I

python------Socket網路程式設計粘包問題

一.socket網路程式設計  粘包:服務端兩次傳送指令在一起,它會把兩次傳送內容合在一起傳送,稱為粘包,從而出現錯誤。 解決方法:(比較low的方法) 有些需要實時更新的,用sleep有延遲,不能這樣解決問題。 解決方法之高階方法: 客戶端: 二.傳送檔案 ftp s

網路程式設計:埠那些事兒

TCP和UDP協議都存在一個叫做埠的東西,但埠卻不是IP協議的一部分。 埠被設計出來主要是為了給協議棧和應用對應: 協議棧用埠號將資料分配給不同的應用層程式 應用層程式用埠號去區分不同的連線,參見之前提到過的“四元組” TCP和UDP協議都使用了埠號(Port num

網路程式設計——伺服器和客戶端資訊的獲取

  目錄 1、字串IP地址和二進位制IP地址結構的轉換 2.套接字檔案描述符的判定 3、IP地址與域名之間的相互轉換 4、協議名稱處理函式 1、字串IP地址和二進位制IP地址結構的轉換 #include <sys/socket.h> #inclu