日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#多线程和线程池

發(fā)布時(shí)間:2023/12/10 C# 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#多线程和线程池 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

.Net的公用語(yǔ)言運(yùn)行時(shí)(Common Language Runtime,CLR)能區(qū)分兩種不同類(lèi)型的線(xiàn)程:前臺(tái)線(xiàn)程和后臺(tái)線(xiàn)程。這兩者的區(qū)別就是:應(yīng)用程序必須運(yùn)行完所有的前臺(tái)線(xiàn)程才可以退出;而對(duì)于后臺(tái)線(xiàn)程,應(yīng)用程序則可以不考慮其是否已經(jīng)運(yùn)行完畢而直接退出,所有的后臺(tái)線(xiàn)程在應(yīng)用程序退出時(shí)都會(huì)自動(dòng)結(jié)束。

前臺(tái)線(xiàn)程和后臺(tái)線(xiàn)程的區(qū)別和聯(lián)系:
1、后臺(tái)線(xiàn)程不會(huì)阻止進(jìn)程的終止。屬于某個(gè)進(jìn)程的所有前臺(tái)線(xiàn)程都終止后,該進(jìn)程就會(huì)被終止。所有剩余的后臺(tái)線(xiàn)程都會(huì)停止且不會(huì)完成。
2、可以在任何時(shí)候?qū)⑶芭_(tái)線(xiàn)程修改為后臺(tái)線(xiàn)程,方式是設(shè)置Thread.IsBackground 屬性。
3、不管是前臺(tái)線(xiàn)程還是后臺(tái)線(xiàn)程,如果線(xiàn)程內(nèi)出現(xiàn)了異常,都會(huì)導(dǎo)致進(jìn)程的終止。
4、托管線(xiàn)程池中的線(xiàn)程都是后臺(tái)線(xiàn)程,使用new Thread方式創(chuàng)建的線(xiàn)程默認(rèn)都是前臺(tái)線(xiàn)程。

說(shuō)明:???

????????應(yīng)用程序的主線(xiàn)程以及使用Thread構(gòu)造的線(xiàn)程都默認(rèn)為前臺(tái)線(xiàn)程


通過(guò)BeginXXX方法運(yùn)行的線(xiàn)程都是后臺(tái)線(xiàn)程。

線(xiàn)程池線(xiàn)程也就是使用 ThreadPool.QueueUserWorkItem()和Task工廠(chǎng)創(chuàng)建的線(xiàn)程都默認(rèn)為后臺(tái)線(xiàn)程


前臺(tái)線(xiàn)程和后臺(tái)線(xiàn)程適合的場(chǎng)合

???????通常,后臺(tái)線(xiàn)程非常適合于完成后臺(tái)任務(wù),應(yīng)該將被動(dòng)偵聽(tīng)活動(dòng)的線(xiàn)程設(shè)置為后臺(tái)線(xiàn)程,而將負(fù)責(zé)發(fā)送數(shù)據(jù)的線(xiàn)程設(shè)置為前臺(tái)線(xiàn)程,這樣,在所有的數(shù)據(jù)發(fā)送完畢之前該線(xiàn)程不會(huì)被終止。
一般前臺(tái)線(xiàn)程用于需要長(zhǎng)時(shí)間等待的任務(wù),比如監(jiān)聽(tīng)客戶(hù)端的請(qǐng)求;后臺(tái)線(xiàn)程一般用于處理時(shí)間較短的任務(wù),比如處理客戶(hù)端發(fā)過(guò)來(lái)的請(qǐng)求信息。

?

1、概念

 ?1.0 線(xiàn)程的和進(jìn)程的關(guān)系以及優(yōu)缺點(diǎn)

  windows系統(tǒng)是一個(gè)多線(xiàn)程的操作系統(tǒng)。一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程。進(jìn)程是線(xiàn)程的容器,一個(gè)C#客戶(hù)端程序開(kāi)始于一個(gè)單獨(dú)的線(xiàn)程,CLR(公共語(yǔ)言運(yùn)行庫(kù))為該進(jìn)程創(chuàng)建了一個(gè)線(xiàn)程,該線(xiàn)程稱(chēng)為主線(xiàn)程。例如當(dāng)我們創(chuàng)建一個(gè)C#控制臺(tái)程序,程序的入口是Main()函數(shù),Main()函數(shù)是始于一個(gè)主線(xiàn)程的。它的功能主要 是產(chǎn)生新的線(xiàn)程和執(zhí)行程序。C#是一門(mén)支持多線(xiàn)程的編程語(yǔ)言,通過(guò)Thread類(lèi)創(chuàng)建子線(xiàn)程,引入using System.Threading命名空間。?

多線(xiàn)程的優(yōu)點(diǎn):?

1

2

1、 多線(xiàn)程可以提高CPU的利用率,因?yàn)楫?dāng)一個(gè)線(xiàn)程處于等待狀態(tài)的時(shí)候,CPU會(huì)去執(zhí)行另外的線(xiàn)程

2、 提高了CPU的利用率,就可以直接提高程序的整體執(zhí)行速度

多線(xiàn)程的缺點(diǎn):

?

1

2

3

1、線(xiàn)程開(kāi)的越多,內(nèi)存占用越大

2、協(xié)調(diào)和管理代碼的難度加大,需要CPU時(shí)間跟蹤線(xiàn)程

3、線(xiàn)程之間對(duì)資源的共享可能會(huì)產(chǎn)生可不遇知的問(wèn)題

?

? ? ?1.1 前臺(tái)線(xiàn)程和后臺(tái)線(xiàn)程

? ? ?C#中的線(xiàn)程分為前臺(tái)線(xiàn)程和后臺(tái)線(xiàn)程,線(xiàn)程創(chuàng)建時(shí)不做設(shè)置默認(rèn)是前臺(tái)線(xiàn)程。即線(xiàn)程屬性IsBackground=false。

Thread.IsBackground = false;//false:設(shè)置為前臺(tái)線(xiàn)程,系統(tǒng)默認(rèn)為前臺(tái)線(xiàn)程。

?區(qū)別以及如何使用:

????這兩者的區(qū)別就是:應(yīng)用程序必須運(yùn)行完所有的前臺(tái)線(xiàn)程才可以退出;而對(duì)于后臺(tái)線(xiàn)程,應(yīng)用程序則可以不考慮其是否已經(jīng)運(yùn)行完畢而直接退出,所有的后臺(tái)線(xiàn)程在應(yīng)用程序退出時(shí)都會(huì)自動(dòng)結(jié)束。一般后臺(tái)線(xiàn)程用于處理時(shí)間較短的任務(wù),如在一個(gè)Web服務(wù)器中可以利用后臺(tái)線(xiàn)程來(lái)處理客戶(hù)端發(fā)過(guò)來(lái)的請(qǐng)求信息。而前臺(tái)線(xiàn)程一般用于處理需要長(zhǎng)時(shí)間等待的任務(wù),如在Web服務(wù)器中的監(jiān)聽(tīng)客戶(hù)端請(qǐng)求的程序。

線(xiàn)程是寄托在進(jìn)程上的,進(jìn)程都結(jié)束了,線(xiàn)程也就不復(fù)存在了!

只要有一個(gè)前臺(tái)線(xiàn)程未退出,進(jìn)程就不會(huì)終止!即說(shuō)的就是程序不會(huì)關(guān)閉!(即在資源管理器中可以看到進(jìn)程未結(jié)束。)

? ? ?1.3 多線(xiàn)程的創(chuàng)建

? ? 下面的代碼創(chuàng)建了一個(gè)子線(xiàn)程,作為程序的入口mian()函數(shù)所在的線(xiàn)程即為主線(xiàn)程,我們通過(guò)Thread類(lèi)來(lái)創(chuàng)建子線(xiàn)程,Thread類(lèi)有?ThreadStart 和 ParameterizedThreadStart類(lèi)型的委托參數(shù),我們也可以直接寫(xiě)方法的名字。線(xiàn)程執(zhí)行的方法可以傳遞參數(shù)(可選),參數(shù)的類(lèi)型為object,寫(xiě)在Start()里。

class Program{//我們的控制臺(tái)程序入口是main函數(shù)。它所在的線(xiàn)程即是主線(xiàn)程static void Main(string[] args) {Thread thread = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法thread.Name = "子線(xiàn)程";//thread.Start("王建"); //在此方法內(nèi)傳遞參數(shù),類(lèi)型為object,發(fā)送和接收涉及到拆裝箱操作thread.Start(); Console.ReadKey();}public static void ThreadMethod(object parameter) //方法內(nèi)可以有參數(shù),也可以沒(méi)有參數(shù){Console.WriteLine("{0}開(kāi)始執(zhí)行。", Thread.CurrentThread.Name);}}

首先使用new Thread()創(chuàng)建出新的線(xiàn)程,然后調(diào)用Start方法使得線(xiàn)程進(jìn)入就緒狀態(tài),得到系統(tǒng)資源后就執(zhí)行,在執(zhí)行過(guò)程中可能有等待、休眠、死亡和阻塞四種狀態(tài)。正常執(zhí)行結(jié)束時(shí)間片后返回到就緒狀態(tài)。如果調(diào)用Suspend方法會(huì)進(jìn)入等待狀態(tài),調(diào)用Sleep或者遇到進(jìn)程同步使用的鎖機(jī)制而休眠等待。具體過(guò)程如下圖所示:

2、線(xiàn)程的基本操作

線(xiàn)程和其它常見(jiàn)的類(lèi)一樣,有著很多屬性和方法,參考下表:

2.1 線(xiàn)程的相關(guān)屬性

我們可以通過(guò)上面表中的屬性獲取線(xiàn)程的一些相關(guān)信息,下面是代碼展示和輸出結(jié)果:

static void Main(string[] args) {Thread thread = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法thread.Name = "子線(xiàn)程"; thread.Start();StringBuilder threadInfo = new StringBuilder();threadInfo.Append(" 線(xiàn)程當(dāng)前的執(zhí)行狀態(tài): " + thread.IsAlive);threadInfo.Append("\n 線(xiàn)程當(dāng)前的名字: " + thread.Name);threadInfo.Append("\n 線(xiàn)程當(dāng)前的優(yōu)先級(jí): " + thread.Priority);threadInfo.Append("\n 線(xiàn)程當(dāng)前的狀態(tài): " + thread.ThreadState);Console.Write(threadInfo);Console.ReadKey();}public static void ThreadMethod(object parameter) {Console.WriteLine("{0}開(kāi)始執(zhí)行。", Thread.CurrentThread.Name);}

?輸輸出結(jié)果: 

2.2 線(xiàn)程的相關(guān)操作

  2.2.1?Abort()方法

     Abort()方法用來(lái)終止線(xiàn)程,調(diào)用此方法強(qiáng)制停止正在執(zhí)行的線(xiàn)程,它會(huì)拋出一個(gè)ThreadAbortException異常從而導(dǎo)致目標(biāo)線(xiàn)程的終止。下面代碼演示:

     

static void Main(string[] args) {Thread thread = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 thread.Name = "小A";thread.Start(); Console.ReadKey();}public static void ThreadMethod(object parameter) {Console.WriteLine("我是:{0},我要終止了", Thread.CurrentThread.Name);//開(kāi)始終止線(xiàn)程Thread.CurrentThread.Abort();//下面的代碼不會(huì)執(zhí)行for (int i = 0; i < 10; i++){Console.WriteLine("我是:{0},我循環(huán){1}次", Thread.CurrentThread.Name,i);}}

執(zhí)行結(jié)果:和我們想象的一樣,下面的循環(huán)沒(méi)有被執(zhí)行

?


  2.2.2?ResetAbort()方法

   ?  Abort方法可以通過(guò)跑出ThreadAbortException異常中止線(xiàn)程,而使用ResetAbort方法可以取消中止線(xiàn)程的操作,下面通過(guò)代碼演示使用?ResetAbort方法。

static void Main(string[] args) {Thread thread = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 thread.Name = "小A";thread.Start(); Console.ReadKey();}public static void ThreadMethod(object parameter) {try{Console.WriteLine("我是:{0},我要終止了", Thread.CurrentThread.Name); //開(kāi)始終止線(xiàn)程Thread.CurrentThread.Abort();}catch(ThreadAbortException ex){Console.WriteLine("我是:{0},我又恢復(fù)了", Thread.CurrentThread.Name);//恢復(fù)被終止的線(xiàn)程Thread.ResetAbort();}for (int i = 0; i < 10; i++){Console.WriteLine("我是:{0},我循環(huán){1}次", Thread.CurrentThread.Name,i);}}

執(zhí)行結(jié)果:


  2.2.3?Sleep()方法?

     ? Sleep()方法調(diào)已阻塞線(xiàn)程,是當(dāng)前線(xiàn)程進(jìn)入休眠狀態(tài),在休眠過(guò)程中占用系統(tǒng)內(nèi)存但是不占用系統(tǒng)時(shí)間,當(dāng)休眠期過(guò)后,繼續(xù)執(zhí)行,聲明如下: ?

public static void Sleep(TimeSpan timeout); //時(shí)間段public static void Sleep(int millisecondsTimeout); //毫秒數(shù)

  實(shí)例代碼:?

static void Main(string[] args){Thread threadA = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadA.Name = "小A";threadA.Start();Console.ReadKey();} public static void ThreadMethod(object parameter) { for (int i = 0; i < 10; i++){ Console.WriteLine("我是:{0},我循環(huán){1}次", Thread.CurrentThread.Name,i);Thread.Sleep(300); //休眠300毫秒 }}

將上面的代碼執(zhí)行以后,可以清楚的看到每次循環(huán)之間相差300毫秒的時(shí)間。

? ? ? 2.2.4?join()方法

     ?Join方法主要是用來(lái)阻塞調(diào)用線(xiàn)程,直到某個(gè)線(xiàn)程終止或經(jīng)過(guò)了指定時(shí)間為止。官方的解釋比較乏味,通俗的說(shuō)就是創(chuàng)建一個(gè)子線(xiàn)程,給它加了這個(gè)方法,其它線(xiàn)程就會(huì)暫停執(zhí)行,直到這個(gè)線(xiàn)程執(zhí)行完為止才去執(zhí)行(包括主線(xiàn)程)。她的方法聲明如下:

public void Join();public bool Join(int millisecondsTimeout); //毫秒數(shù)public bool Join(TimeSpan timeout);       //時(shí)間段

為了驗(yàn)證上面所說(shuō)的,我們首先看一段代碼: ?

static void Main(string[] args){Thread threadA = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadA.Name = "小A";Thread threadB = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadB.Name = "小B";threadA.Start();//threadA.Join();  threadB.Start();//threadB.Join();for (int i = 0; i < 10; i++){ Console.WriteLine("我是:主線(xiàn)程,我循環(huán){1}次", Thread.CurrentThread.Name, i);Thread.Sleep(300); //休眠300毫秒 }Console.ReadKey();} public static void ThreadMethod(object parameter) { for (int i = 0; i < 10; i++){ Console.WriteLine("我是:{0},我循環(huán){1}次", Thread.CurrentThread.Name,i);Thread.Sleep(300); //休眠300毫秒 }}

?

因?yàn)榫€(xiàn)程之間的執(zhí)行是隨機(jī)的,所有執(zhí)行結(jié)果和我們想象的一樣,雜亂無(wú)章!但是說(shuō)明他們是同時(shí)執(zhí)行的。

? ? ?現(xiàn)在我們把代碼中的 ?ThreadA.join()方法注釋取消,首先程序中有三個(gè)線(xiàn)程,ThreadA、ThreadB和主線(xiàn)程,首先主線(xiàn)程先阻塞,然后線(xiàn)程ThreadB阻塞,ThreadA先執(zhí)行,執(zhí)行完畢以后ThreadB接著執(zhí)行,最后才是主線(xiàn)程執(zhí)行。

看執(zhí)行結(jié)果:

?

? ? ? ? 2.2.5?Suspent()和Resume()方法

?? ? ? 其實(shí)在C# 2.0以后, Suspent()和Resume()方法已經(jīng)過(guò)時(shí)了。suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目標(biāo)線(xiàn)程會(huì)停下來(lái),但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線(xiàn)程都不能訪(fǎng)問(wèn)鎖定的資源,除非被”掛起”的線(xiàn)程恢復(fù)運(yùn)行。對(duì)任何線(xiàn)程來(lái)說(shuō),如果它們想恢復(fù)目標(biāo)線(xiàn)程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)造成死鎖。所以不應(yīng)該使用suspend()。

?

static void Main(string[] args){Thread threadA = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadA.Name = "小A"; threadA.Start(); Thread.Sleep(3000); //休眠3000毫秒 threadA.Resume(); //繼續(xù)執(zhí)行已經(jīng)掛起的線(xiàn)程Console.ReadKey();}public static void ThreadMethod(object parameter){Thread.CurrentThread.Suspend(); //掛起當(dāng)前線(xiàn)程for (int i = 0; i < 10; i++){Console.WriteLine("我是:{0},我循環(huán){1}次", Thread.CurrentThread.Name, i); }}

?

? ? ? ?執(zhí)行上面的代碼。窗口并沒(méi)有馬上執(zhí)行 ThreadMethod方法輸出循環(huán)數(shù)字,而是等待了三秒鐘之后才輸出,因?yàn)榫€(xiàn)程開(kāi)始執(zhí)行的時(shí)候執(zhí)行了Suspend()方法掛起。然后主線(xiàn)程休眠了3秒鐘以后又通過(guò)Resume()方法恢復(fù)了線(xiàn)程threadA。

? ? 2.2.6 線(xiàn)程的優(yōu)先級(jí)

  如果在應(yīng)用程序中有多個(gè)線(xiàn)程在運(yùn)行,但一些線(xiàn)程比另一些線(xiàn)程重要,這種情況下可以在一個(gè)進(jìn)程中為不同的線(xiàn)程指定不同的優(yōu)先級(jí)。線(xiàn)程的優(yōu)先級(jí)可以通過(guò)Thread類(lèi)Priority屬性設(shè)置,Priority屬性是一個(gè)ThreadPriority型枚舉,列舉了5個(gè)優(yōu)先等級(jí):AboveNormal、BelowNormal、Highest、Lowest、Normal。公共語(yǔ)言運(yùn)行庫(kù)默認(rèn)是Normal類(lèi)型的。見(jiàn)下圖:

直接上代碼來(lái)看效果:

?View Code

執(zhí)行結(jié)果:

上面的代碼中有三個(gè)線(xiàn)程,threadA,threadB和主線(xiàn)程,threadA優(yōu)先級(jí)最高,threadB優(yōu)先級(jí)最低。這一點(diǎn)從運(yùn)行結(jié)果中也可以看出,線(xiàn)程B 偶爾會(huì)出現(xiàn)在主線(xiàn)程和線(xiàn)程A前面。當(dāng)有多個(gè)線(xiàn)程同時(shí)處于可執(zhí)行狀態(tài),系統(tǒng)優(yōu)先執(zhí)行優(yōu)先級(jí)較高的線(xiàn)程,但這只意味著優(yōu)先級(jí)較高的線(xiàn)程占有更多的CPU時(shí)間,并不意味著一定要先執(zhí)行完優(yōu)先級(jí)較高的線(xiàn)程,才會(huì)執(zhí)行優(yōu)先級(jí)較低的線(xiàn)程。

優(yōu)先級(jí)越高表示CPU分配給該線(xiàn)程的時(shí)間片越多,執(zhí)行時(shí)間就多

優(yōu)先級(jí)越低表示CPU分配給該線(xiàn)程的時(shí)間片越少,執(zhí)行時(shí)間就少

? ?3、線(xiàn)程同步

  什么是線(xiàn)程安全:

  線(xiàn)程安全是指在當(dāng)一個(gè)線(xiàn)程訪(fǎng)問(wèn)該類(lèi)的某個(gè)數(shù)據(jù)時(shí),進(jìn)行保護(hù),其他線(xiàn)程不能進(jìn)行訪(fǎng)問(wèn)直到該線(xiàn)程讀取完,其他線(xiàn)程才可使用。不會(huì)出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。

   線(xiàn)程有可能和其他線(xiàn)程共享一些資源,比如,內(nèi)存,文件,數(shù)據(jù)庫(kù)等。當(dāng)多個(gè)線(xiàn)程同時(shí)讀寫(xiě)同一份共享資源的時(shí)候,可能會(huì)引起沖突。這時(shí)候,我們需要引入線(xiàn)程“同步”機(jī)制,即各位線(xiàn)程之間要有個(gè)先來(lái)后到,不能一窩蜂擠上去搶作一團(tuán)。線(xiàn)程同步的真實(shí)意思和字面意思恰好相反。線(xiàn)程同步的真實(shí)意思,其實(shí)是“排隊(duì)”:幾個(gè)線(xiàn)程之間要排隊(duì),一個(gè)一個(gè)對(duì)共享資源進(jìn)行操作,而不是同時(shí)進(jìn)行操作。

為什么要實(shí)現(xiàn)同步呢,下面的例子我們拿著名的單例模式來(lái)說(shuō)吧。看代碼

public class Singleton{private static Singleton instance; private Singleton() //私有函數(shù),防止實(shí)例{} public static Singleton GetInstance(){if (instance == null){instance = new Singleton();}return instance;}}

? ? ? ?單例模式就是保證在整個(gè)應(yīng)用程序的生命周期中,在任何時(shí)刻,被指定的類(lèi)只有一個(gè)實(shí)例,并為客戶(hù)程序提供一個(gè)獲取該實(shí)例的全局訪(fǎng)問(wèn)點(diǎn)。但上面代碼有一個(gè)明顯的問(wèn)題,那就是假如兩個(gè)線(xiàn)程同時(shí)去獲取這個(gè)對(duì)象實(shí)例,那。。。。。。。。

我們隊(duì)代碼進(jìn)行修改:

public class Singleton {private static Singleton instance;private static object obj=new object(); private Singleton()        //私有化構(gòu)造函數(shù){} public static Singleton GetInstance(){if(instance==null){lock(obj) //通過(guò)Lock關(guān)鍵字實(shí)現(xiàn)同步{if(instance==null){instance=new Singleton();}}}return instance;} }

經(jīng)過(guò)修改后的代碼。加了一個(gè) lock(obj)代碼塊。這樣就能夠?qū)崿F(xiàn)同步了,假如不是很明白的話(huà),咱們看后面繼續(xù)講解~

  3.0 使用Lock關(guān)鍵字實(shí)現(xiàn)線(xiàn)程同步?

  首先創(chuàng)建兩個(gè)線(xiàn)程,兩個(gè)線(xiàn)程執(zhí)行同一個(gè)方法,參考下面的代碼:

static void Main(string[] args){Thread threadA = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadA.Name = "王文建";Thread threadB = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadB.Name = "生旭鵬";threadA.Start();threadB.Start();Console.ReadKey();}public static void ThreadMethod(object parameter){ for (int i = 0; i < 10; i++){Console.WriteLine("我是:{0},我循環(huán){1}次", Thread.CurrentThread.Name, i);Thread.Sleep(300);}}

執(zhí)行結(jié)果:

?

通過(guò)上面的執(zhí)行結(jié)果,可以很清楚的看到,兩個(gè)線(xiàn)程是在同時(shí)執(zhí)行ThreadMethod這個(gè)方法,這顯然不符合我們線(xiàn)程同步的要求。我們對(duì)代碼進(jìn)行修改如下:

?View Code

執(zhí)行結(jié)果:

我們通過(guò)添加了 lock(this) {...}代碼,查看執(zhí)行結(jié)果實(shí)現(xiàn)了我們想要的線(xiàn)程同步需求。但是我們知道this表示當(dāng)前類(lèi)實(shí)例的本身,那么有這么一種情況,我們把需要訪(fǎng)問(wèn)的方法所在的類(lèi)型進(jìn)行兩個(gè)實(shí)例A和B,線(xiàn)程A訪(fǎng)問(wèn)實(shí)例A的方法ThreadMethod,線(xiàn)程B訪(fǎng)問(wèn)實(shí)例B的方法ThreadMethod,這樣的話(huà)還能夠達(dá)到線(xiàn)程同步的需求嗎。

?View Code

執(zhí)行結(jié)果:

我們會(huì)發(fā)現(xiàn),線(xiàn)程又沒(méi)有實(shí)現(xiàn)同步了!lock(this)對(duì)于這種情況是不行的!所以需要我們對(duì)代碼進(jìn)行修改!修改后的代碼如下:?

?View Code

通過(guò)查看執(zhí)行結(jié)果。會(huì)發(fā)現(xiàn)代碼實(shí)現(xiàn)了我們的需求。那么?lock(this) 和lock(Obj)有什么區(qū)別呢??

lock(this) 鎖定 當(dāng)前實(shí)例對(duì)象,如果有多個(gè)類(lèi)實(shí)例的話(huà),lock鎖定的只是當(dāng)前類(lèi)實(shí)例,對(duì)其它類(lèi)實(shí)例無(wú)影響。所有不推薦使用。 lock(typeof(Model))鎖定的是model類(lèi)的所有實(shí)例。 lock(obj)鎖定的對(duì)象是全局的私有化靜態(tài)變量。外部無(wú)法對(duì)該變量進(jìn)行訪(fǎng)問(wèn)。 lock 確保當(dāng)一個(gè)線(xiàn)程位于代碼的臨界區(qū)時(shí),另一個(gè)線(xiàn)程不進(jìn)入臨界區(qū)。如果其他線(xiàn)程試圖進(jìn)入鎖定的代碼,則它將一直等待(即被阻止),直到該對(duì)象被釋放。 所以,lock的結(jié)果好不好,還是關(guān)鍵看鎖的誰(shuí),如果外邊能對(duì)這個(gè)誰(shuí)進(jìn)行修改,lock就失去了作用。所以一般情況下,使用私有的、靜態(tài)的并且是只讀的對(duì)象。

總結(jié):

1、lock的是必須是引用類(lèi)型的對(duì)象,string類(lèi)型除外。

2、lock推薦的做法是使用靜態(tài)的、只讀的、私有的對(duì)象。

3、保證lock的對(duì)象在外部無(wú)法修改才有意義,如果lock的對(duì)象在外部改變了,對(duì)其他線(xiàn)程就會(huì)暢通無(wú)阻,失去了lock的意義。

? ? ?不能鎖定字符串,鎖定字符串尤其危險(xiǎn),因?yàn)樽址还舱Z(yǔ)言運(yùn)行庫(kù) (CLR)“暫留”。 這意味著整個(gè)程序中任何給定字符串都只有一個(gè)實(shí)例,就是這同一個(gè)對(duì)象表示了所有運(yùn)行的應(yīng)用程序域的所有線(xiàn)程中的該文本。因此,只要在應(yīng)用程序進(jìn)程中的任何位置處具有相同內(nèi)容的字符串上放置了鎖,就將鎖定應(yīng)用程序中該字符串的所有實(shí)例。通常,最好避免鎖定 public 類(lèi)型或鎖定不受應(yīng)用程序控制的對(duì)象實(shí)例。例如,如果該實(shí)例可以被公開(kāi)訪(fǎng)問(wèn),則 lock(this) 可能會(huì)有問(wèn)題,因?yàn)椴皇芸刂频拇a也可能會(huì)鎖定該對(duì)象。這可能導(dǎo)致死鎖,即兩個(gè)或更多個(gè)線(xiàn)程等待釋放同一對(duì)象。出于同樣的原因,鎖定公共數(shù)據(jù)類(lèi)型(相比于對(duì)象)也可能導(dǎo)致問(wèn)題。而且lock(this)只對(duì)當(dāng)前對(duì)象有效,如果多個(gè)對(duì)象之間就達(dá)不到同步的效果。lock(typeof(Class))與鎖定字符串一樣,范圍太廣了。

  3.1 使用Monitor類(lèi)實(shí)現(xiàn)線(xiàn)程同步?? ? ?

? ? ? Lock關(guān)鍵字是Monitor的一種替換用法,lock在IL代碼中會(huì)被翻譯成Monitor.?

? ? ?lock(obj)

? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?//代碼段
? ? ? ? ? ? ?}?
? ? 就等同于?
? ? Monitor.Enter(obj);?
? ? ? ? ? ? ? ? //代碼段
? ? Monitor.Exit(obj); ?

? ? ? ? ???Monitor的常用屬性和方法:

    Enter(Object)?在指定對(duì)象上獲取排他鎖。

    Exit(Object)?釋放指定對(duì)象上的排他鎖。?

?

    Pulse?通知等待隊(duì)列中的線(xiàn)程鎖定對(duì)象狀態(tài)的更改。

    PulseAll?通知所有的等待線(xiàn)程對(duì)象狀態(tài)的更改。

    TryEnter(Object)?試圖獲取指定對(duì)象的排他鎖。

    TryEnter(Object, Boolean)?嘗試獲取指定對(duì)象上的排他鎖,并自動(dòng)設(shè)置一個(gè)值,指示是否得到了該鎖。

    Wait(Object)?釋放對(duì)象上的鎖并阻止當(dāng)前線(xiàn)程,直到它重新獲取該鎖。

? ? ? 常用的方法有兩個(gè),Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,這就是Monitor最常用的兩個(gè)方法,在使用過(guò)程中為了避免獲取鎖之后因?yàn)楫惓?#xff0c;致鎖無(wú)法釋放,所以需要在try{} catch(){}之后的finally{}結(jié)構(gòu)體中釋放鎖(Monitor.Exit())。

Enter(Object)的用法很簡(jiǎn)單,看代碼?

static void Main(string[] args){ Thread threadA = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadA.Name = "A";Thread threadB = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadB.Name = "B";threadA.Start();threadB.Start();Thread.CurrentThread.Name = "C";ThreadMethod();Console.ReadKey();}static object obj = new object();public static void ThreadMethod(){Monitor.Enter(obj); //Monitor.Enter(obj) 鎖定對(duì)象try{for (int i = 0; i < 500; i++){Console.Write(Thread.CurrentThread.Name); }}catch(Exception ex){ }finally{ Monitor.Exit(obj); //釋放對(duì)象} }

?

TryEnter(Object)TryEnter()?方法在嘗試獲取一個(gè)對(duì)象上的顯式鎖方面和 Enter() 方法類(lèi)似。然而,它不像Enter()方法那樣會(huì)阻塞執(zhí)行。如果線(xiàn)程成功進(jìn)入關(guān)鍵區(qū)域那么TryEnter()方法會(huì)返回true.?和試圖獲取指定對(duì)象的排他鎖。看下面代碼演示:

? ? ? 我們可以通過(guò)Monitor.TryEnter(monster, 1000),該方法也能夠避免死鎖的發(fā)生,我們下面的例子用到的是該方法的重載,Monitor.TryEnter(Object,Int32),。?

static void Main(string[] args){ Thread threadA = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadA.Name = "A";Thread threadB = new Thread(ThreadMethod); //執(zhí)行的必須是無(wú)返回值的方法 threadB.Name = "B";threadA.Start();threadB.Start();Thread.CurrentThread.Name = "C";ThreadMethod();Console.ReadKey();}static object obj = new object();public static void ThreadMethod(){bool flag = Monitor.TryEnter(obj, 1000); //設(shè)置1S的超時(shí)時(shí)間,如果在1S之內(nèi)沒(méi)有獲得同步鎖,則返回false//上面的代碼設(shè)置了鎖定超時(shí)時(shí)間為1秒,也就是說(shuō),在1秒中后,//lockObj還未被解鎖,TryEntry方法就會(huì)返回false,如果在1秒之內(nèi),lockObj被解鎖,TryEntry返回true。我們可以使用這種方法來(lái)避免死鎖try{if (flag){for (int i = 0; i < 500; i++){Console.Write(Thread.CurrentThread.Name); }}}catch(Exception ex){}finally{if (flag)Monitor.Exit(obj);} }

?Monitor.Wait和Monitor()Pause()

Wait(object)方法:釋放對(duì)象上的鎖并阻止當(dāng)前線(xiàn)程,直到它重新獲取該鎖,該線(xiàn)程進(jìn)入等待隊(duì)列。
?Pulse方法:只有鎖的當(dāng)前所有者可以使用?Pulse?向等待對(duì)象發(fā)出信號(hào),當(dāng)前擁有指定對(duì)象上的鎖的線(xiàn)程調(diào)用此方法以便向隊(duì)列中的下一個(gè)線(xiàn)程發(fā)出鎖的信號(hào)。接收到脈沖后,等待線(xiàn)程就被移動(dòng)到就緒隊(duì)列中。在調(diào)用?Pulse?的線(xiàn)程釋放鎖后,就緒隊(duì)列中的下一個(gè)線(xiàn)程(不一定是接收到脈沖的線(xiàn)程)將獲得該鎖。
另外

? ? ? ??Wait 和 Pulse 方法必須寫(xiě)在?Monitor.Enter 和Moniter.Exit 之間

上面是MSDN的解釋。不明白看代碼:

?首先我們定義一個(gè)攻擊類(lèi),

/// <summary>/// 怪物類(lèi)/// </summary>internal class Monster{public int Blood { get; set; }public Monster(int blood){this.Blood = blood;Console.WriteLine("我是怪物,我有{0}滴血",blood);}}

然后在定義一個(gè)攻擊類(lèi)

/// <summary>/// 攻擊類(lèi)/// </summary>internal class Play{/// <summary>/// 攻擊者名字/// </summary>public string Name { get; set; } /// <summary>/// 攻擊力/// </summary>public int Power{ get; set; }/// <summary>/// 法術(shù)攻擊/// </summary>public void magicExecute(object monster){Monster m = monster as Monster;Monitor.Enter(monster);while (m.Blood>0){Monitor.Wait(monster);Console.WriteLine("當(dāng)前英雄:{0},正在使用法術(shù)攻擊打擊怪物", this.Name);if(m.Blood>= Power){m.Blood -= Power;}else{m.Blood = 0;}Thread.Sleep(300);Console.WriteLine("怪物的血量還剩下{0}", m.Blood);Monitor.PulseAll(monster);}Monitor.Exit(monster);}/// <summary>/// 物理攻擊/// </summary>/// <param name="monster"></param>public void physicsExecute(object monster){Monster m = monster as Monster;Monitor.Enter(monster);while (m.Blood > 0){Monitor.PulseAll(monster);if (Monitor.Wait(monster, 1000)) //非常關(guān)鍵的一句代碼{Console.WriteLine("當(dāng)前英雄:{0},正在使用物理攻擊打擊怪物", this.Name);if (m.Blood >= Power){m.Blood -= Power;}else{m.Blood = 0;}Thread.Sleep(300);Console.WriteLine("怪物的血量還剩下{0}", m.Blood);}}Monitor.Exit(monster);}}

執(zhí)行代碼:

    static void Main(string[] args){//怪物類(lèi)Monster monster = new Monster(1000);//物理攻擊類(lèi)Play play1 = new Play() { Name = "無(wú)敵劍圣", Power = 100 };//魔法攻擊類(lèi)Play play2 = new Play() { Name = "流浪法師", Power = 120 };Thread thread_first = new Thread(play1.physicsExecute); //物理攻擊線(xiàn)程Thread thread_second = new Thread(play2.magicExecute); //魔法攻擊線(xiàn)程thread_first.Start(monster);thread_second.Start(monster);Console.ReadKey();}

輸出結(jié)果:

總結(jié):

  第一種情況:

  • thread_first首先獲得同步對(duì)象的鎖,當(dāng)執(zhí)行到?Monitor.Wait(monster);時(shí),thread_first線(xiàn)程釋放自己對(duì)同步對(duì)象的鎖,流放自己到等待隊(duì)列,直到自己再次獲得鎖,否則一直阻塞。
  • 而thread_second線(xiàn)程一開(kāi)始就競(jìng)爭(zhēng)同步鎖所以處于就緒隊(duì)列中,這時(shí)候thread_second直接從就緒隊(duì)列出來(lái)獲得了monster對(duì)象鎖,開(kāi)始執(zhí)行到Monitor.PulseAll(monster)時(shí),發(fā)送了個(gè)Pulse信號(hào)。
  • 這時(shí)候thread_first接收到信號(hào)進(jìn)入到就緒狀態(tài)。然后thread_second繼續(xù)往下執(zhí)行到 Monitor.Wait(monster, 1000)時(shí),這是一句非常關(guān)鍵的代碼,thread_second將自己流放到等待隊(duì)列并釋放自身對(duì)同步鎖的獨(dú)占,該等待設(shè)置了1S的超時(shí)值,當(dāng)B線(xiàn)程在1S之內(nèi)沒(méi)有再次獲取到鎖自動(dòng)添加到就緒隊(duì)列。
  • 這時(shí)thread_first從Monitor.Wait(monster)的阻塞結(jié)束,返回true。開(kāi)始執(zhí)行、打印。執(zhí)行下一行的Monitor.Pulse(monster),這時(shí)候thread_second假如1S的時(shí)間還沒(méi)過(guò),thread_second接收到信號(hào),于是將自己添加到就緒隊(duì)列。
  • thread_first的同步代碼塊結(jié)束以后,thread_second再次獲得執(zhí)行權(quán),?Monitor.Wait(m_smplQueue, 1000)返回true,于是繼續(xù)從該代碼處往下執(zhí)行、打印。當(dāng)再次執(zhí)行到Monitor.Wait(monster, 1000),又開(kāi)始了步驟3。
  • 依次循環(huán)。。。。
  •   ?第二種情況:thread_second首先獲得同步鎖對(duì)象,首先執(zhí)行到Monitor.PulseAll(monster),因?yàn)槌绦蛑袥](méi)有需要等待信號(hào)進(jìn)入就緒狀態(tài)的線(xiàn)程,所以這一句代碼沒(méi)有意義,當(dāng)執(zhí)行到?Monitor.Wait(monster, 1000),自動(dòng)將自己流放到等待隊(duì)列并在這里阻塞,1S 時(shí)間過(guò)后thread_second自動(dòng)添加到就緒隊(duì)列,線(xiàn)程thread_first獲得monster對(duì)象鎖,執(zhí)行到Monitor.Wait(monster);時(shí)發(fā)生阻塞釋放同步對(duì)象鎖,線(xiàn)程thread_second執(zhí)行,執(zhí)行Monitor.PulseAll(monster)時(shí)通知thread_first。于是又開(kāi)始第一種情況...

    Monitor.Wait是讓當(dāng)前進(jìn)程睡眠在臨界資源上并釋放獨(dú)占鎖,它只是等待,并不退出,當(dāng)?shù)却Y(jié)束,就要繼續(xù)執(zhí)行剩下的代碼。

    ?

      3.0 使用Mutex類(lèi)實(shí)現(xiàn)線(xiàn)程同步

    ? ? ??Mutex的突出特點(diǎn)是可以跨應(yīng)用程序域邊界對(duì)資源進(jìn)行獨(dú)占訪(fǎng)問(wèn),即可以用于同步不同進(jìn)程中的線(xiàn)程,這種功能當(dāng)然這是以犧牲更多的系統(tǒng)資源為代價(jià)的。

      主要常用的兩個(gè)方法:

    ?public virtual bool WaitOne() ??阻止當(dāng)前線(xiàn)程,直到當(dāng)前 System.Threading.WaitHandle 收到信號(hào)獲取互斥鎖。

    ?public void ReleaseMutex() ? ??釋放 System.Threading.Mutex 一次。

      使用實(shí)例:

       static void Main(string[] args){Thread[] thread = new Thread[3];for (int i = 0; i < 3; i++){thread[i] = new Thread(ThreadMethod1);thread[i].Name = i.ToString();}for (int i = 0; i < 3; i++){thread[i].Start();}Console.ReadKey(); } public static void ThreadMethod1(object val){mutet.WaitOne();    //獲取鎖for (int i = 0; i < 500; i++){Console.Write(Thread.CurrentThread.Name); } mutet.ReleaseMutex(); //釋放鎖}

    ?2、線(xiàn)程池

    ? ? ??上面介紹了介紹了平時(shí)用到的大多數(shù)的多線(xiàn)程的例子,但在實(shí)際開(kāi)發(fā)中使用的線(xiàn)程往往是大量的和更為復(fù)雜的,這時(shí),每次都創(chuàng)建線(xiàn)程、啟動(dòng)線(xiàn)程。從性能上來(lái)講,這樣做并不理想(因?yàn)槊渴褂靡粋€(gè)線(xiàn)程就要?jiǎng)?chuàng)建一個(gè),需要占用系統(tǒng)開(kāi)銷(xiāo));從操作上來(lái)講,每次都要啟動(dòng),比較麻煩。為此引入的線(xiàn)程池的概念。

    ??好處:

    ? 1.減少在創(chuàng)建和銷(xiāo)毀線(xiàn)程上所花的時(shí)間以及系統(tǒng)資源的開(kāi)銷(xiāo)?
    ? 2.如不使用線(xiàn)程池,有可能造成系統(tǒng)創(chuàng)建大量線(xiàn)程而導(dǎo)致消耗完系統(tǒng)內(nèi)存以及”過(guò)度切換”。

    在什么情況下使用線(xiàn)程池??

    ??? 1.單個(gè)任務(wù)處理的時(shí)間比較短?
    ??? 2.需要處理的任務(wù)的數(shù)量大?

    線(xiàn)程池最多管理線(xiàn)程數(shù)量=“處理器數(shù) * 250”。也就是說(shuō),如果您的機(jī)器為2個(gè)2核CPU,那么CLR線(xiàn)程池的容量默認(rèn)上限便是1000

    通過(guò)線(xiàn)程池創(chuàng)建的線(xiàn)程默認(rèn)為后臺(tái)線(xiàn)程,優(yōu)先級(jí)默認(rèn)為Normal。

    代碼示例:

        static void Main(string[] args){ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod1), new object()); //參數(shù)可選Console.ReadKey();}public static void ThreadMethod1(object val){ for (int i = 0; i <= 500000000; i++){if (i % 1000000 == 0){Console.Write(Thread.CurrentThread.Name);} } }

    ?

    ?

    有關(guān)線(xiàn)程池的解釋請(qǐng)參考:

    http://www.cnblogs.com/JeffreyZhao/archive/2009/07/22/thread-pool-1-the-goal-and-the-clr-thread-pool.html

    總結(jié)

    以上是生活随笔為你收集整理的C#多线程和线程池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    成人av网页 | 在线观看精品 | 久久97久久 | 色播六月天 | 国产看片 色 | 韩国av免费 | 综合色爱| 国模一区二区三区四区 | 福利av影院 | 国产高清黄色 | 日韩精品字幕 | 久久99久久99久久 | 伊人狠狠色 | 免费网站看av片 | 成人黄色毛片 | av.com在线 | 人人爽人人爽人人片av免 | 免费黄色特级片 | 国产在线观看91 | 成+人+色综合 | 精品国产免费观看 | www.亚洲精品视频 | 欧美日韩久久一区 | 久久精品国产一区二区 | 日韩视频在线观看视频 | 国产一区高清在线观看 | 色婷婷国产 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 日韩在线观看视频一区二区三区 | 亚洲色图22p | 日本一区二区三区视频在线播放 | 国产日韩欧美在线看 | 色av色av色av| 中文字幕在线播放日韩 | 一区二区电影在线观看 | 插插插色综合 | 日日日操 | 国产精品久久久久久69 | 99精品国产99久久久久久97 | 91porny九色91啦中文 | 久久99最新地址 | 国产中文字幕免费 | 亚洲精品美女 | 天天伊人狠狠 | 国产视频99 | 96看片| 国产精品美女久久久久久 | 日韩三级一区 | 麻豆手机在线 | 五月婷丁香 | 天天天天综合 | 97成人在线观看视频 | 久久久久99精品国产片 | 国产最新网站 | 国产69精品久久久久9999apgf | 午夜久久久久 | 欧美精品久久久久久久免费 | 四虎最新入口 | 二区三区av | 国产亚洲情侣一区二区无 | 一级黄色片在线观看 | 国产精品久久久久久久久久久久午 | 日韩欧美精品在线 | 天堂av在线免费 | 99久久超碰中文字幕伊人 | 亚洲欧美观看 | 中文字幕在线视频一区二区三区 | 久久网址 | 97超视频免费观看 | 亚洲成人频道 | 久久av黄色 | 夜夜操天天 | 久久999精品 | 天干啦夜天干天干在线线 | 色婷婷久久一区二区 | 在线视频你懂 | 成av在线 | 特级西西www44高清大胆图片 | 日韩精选在线观看 | 精品伦理一区二区三区 | 久久久精品99 | 超碰在线人人 | 九九九九九九精品 | 日韩精品视频免费在线观看 | 日韩免费观看视频 | 久久99久久99精品免视看婷婷 | 人人dvd| 天天操夜| 婷婷久久一区 | 久草在线视频看看 | 中文字幕在线观看第三页 | 久久这里只有精品首页 | av片在线观看 | 欧洲高潮三级做爰 | 婷婷天天色| 日韩精品一区二区三区中文字幕 | 黄色av一区二区三区 | 欧美va天堂在线电影 | 一区二区三区在线视频观看58 | 中文字幕在线视频第一页 | 在线观看网站av | 国产不卡免费av | 在线视频 影院 | 国产日韩欧美在线看 | 免费视频黄色 | 婷婷色网视频在线播放 | 成人黄色在线 | 天天插伊人 | 欧美一区二区免费在线观看 | 激情婷婷欧美 | 国产九色91 | 麻豆传媒在线免费看 | 国产一区在线播放 | 黄免费在线观看 | 亚洲欧美婷婷六月色综合 | 日韩国产欧美视频 | av在线观| 日韩欧美第二页 | 国产精品99蜜臀久久不卡二区 | 日韩精品在线视频 | 手机av网站 | 91自拍视频在线 | 91麻豆高清视频 | 色偷偷网站视频 | 黄色毛片网站在线观看 | 婷婷激情欧美 | 91视频麻豆视频 | 久久久久久久久久久影视 | 丁香婷婷在线观看 | 1024手机在线看| 欧美日韩后 | 国产成人黄色网址 | 国产精品不卡 | 成人免费xyz网站 | 精品久久久久久亚洲综合网站 | 99热这里只有精品8 久久综合毛片 | 久久视频在线视频 | 色老板在线视频 | av在线之家电影网站 | 亚洲第一成网站 | 欧美成年人在线视频 | 日韩av进入 | 9999精品免费视频 | 精品免费一区 | 日韩精品中文字幕在线播放 | 日韩在线观看高清 | 国产在线高清 | 色94色欧美 | 精品主播网红福利资源观看 | 国产最新视频在线观看 | 四虎国产免费 | 天天操夜夜叫 | 久草在线手机观看 | 日韩在线视频免费观看 | 日本乱视频 | 日韩欧美极品 | 黄色软件在线观看免费 | 国产一区二区精品久久91 | 日日夜夜免费精品 | 97超碰在线久草超碰在线观看 | 婷婷激情网站 | 国产精品完整版 | 最近高清中文在线字幕在线观看 | 欧美日产一区 | 超碰在线色 | 91麻豆精品国产91久久久使用方法 | 欧美精品小视频 | 2019av在线视频| 91大片网站| 综合色亚洲 | 免费网址在线播放 | 日韩久久视频 | 伊人在线视频 | 久久久久五月天 | 日韩精品中文字幕久久臀 | 中文字幕之中文字幕 | 国产无套视频 | 人人澡人人澡人人 | 热久久免费视频 | 日韩专区在线 | 成人午夜电影在线观看 | 亚洲精品国产精品国产 | 日本一区二区三区免费看 | 丝袜+亚洲+另类+欧美+变态 | 最近中文字幕大全中文字幕免费 | 超碰人人乐 | 五月天天色 | 婷婷六月久久 | 欧美日韩精品免费观看 | 亚洲四虎 | 日韩黄色在线 | 人人澡澡人人 | 成人福利在线观看 | 91视频在线国产 | 免费看三级 | 国产视频一二区 | 99久在线精品99re8热视频 | 亚洲91av | 久久免费观看少妇a级毛片 久久久久成人免费 | 丁香六月婷婷 | 特级a老妇做爰全过程 | 激情丁香| 另类老妇性bbwbbw高清 | 玖玖玖在线观看 | 激情开心网站 | 日韩在线视频一区二区三区 | 亚洲理论片| 色视频在线免费 | 精品99免费视频 | av专区在线 | 欧美在线资源 | av解说在线观看 | 亚洲精品视频二区 | 免费在线中文字幕 | 中文字幕在线观看第一区 | 婷婷激情综合 | 激情小说网站亚洲综合网 | 欧美午夜精品久久久久久孕妇 | 韩国一区二区三区视频 | 日本中文不卡 | 丁香婷婷综合五月 | 中文字幕黄色av | 日韩激情在线 | 国产精品视频永久免费播放 | 久久综合导航 | 久久网址 | 黄色av网站在线观看免费 | 婷婷丁香av | 免费黄色特级片 | 婷婷色综合 | 五月开心综合 | 91精品久久久久久久久久久久久 | 黄色片网站av | 久久久91精品国产一区二区精品 | 久久久久久毛片精品免费不卡 | 国产色久 | 91久久国产综合精品女同国语 | 国产午夜三级 | 欧美9999 | 天堂网在线视频 | 97网在线观看 | 日韩精品在线免费播放 | 欧美va天堂va视频va在线 | 日韩欧美一区二区三区免费观看 | 久久久这里有精品 | 色婷婷综合久色 | 日韩视频中文字幕 | 91精品国产自产在线观看永久 | 久久er99热精品一区二区三区 | 久久久久久久久电影 | 九色精品| 成人小视频在线播放 | 亚洲 欧美 国产 va在线影院 | 日韩色在线观看 | 五月婷婷丁香在线观看 | 欧美大片在线看免费观看 | 久久久精品国产一区二区电影四季 | 天天干天天射天天插 | 午夜精品久久久久久久爽 | 美女网站免费福利视频 | 国产三级国产精品国产专区50 | 黄色av成人在线观看 | 久久免费福利视频 | 亚洲成aⅴ人片久久青草影院 | 99精品久久久| 综合国产在线观看 | 最新一区二区三区 | 久久深爱网 | 亚洲午夜久久久久久久久 | 久久99精品国产一区二区三区 | aa一级片| 亚洲国产一二三 | 在线视频你懂得 | 国产在线最新 | 99精品视频99 | 在线中文视频 | 国产免费久久久久 | 久久看片网站 | 少妇精品久久久一区二区免费 | 奇米7777狠狠狠琪琪视频 | 日韩欧美一区二区三区视频 | 中文字幕免费观看全部电影 | 久久久影视 | 91av电影在线 | 麻豆 free xxxx movies hd | 久久手机在线视频 | www.国产高清 | 久要激情网 | av一区二区三区在线观看 | av电影中文 | 66av99精品福利视频在线 | 超碰97人人爱| 欧美日韩国产一区 | 久久国产精品99国产精 | 欧美一级大片在线观看 | 天天草视频| 五月天激情视频 | 国产日韩视频在线观看 | 五月花丁香婷婷 | 精品视频在线观看 | 91热这里只有精品 | 亚洲成人国产 | 九9热这里真品2 | 91精品啪啪 | 久久免费在线观看视频 | 韩日电影在线免费看 | 九九精品久久 | 天堂在线v | 国产91九色视频 | 日韩r级电影在线观看 | 国产精品 久久 | 国产精品久久久久999 | 精品久久电影 | 欧美精品久久久久久久久免 | 免费在线播放视频 | 国产亚洲字幕 | 国产亚洲精品女人久久久久久 | 免费在线日韩 | 欧美日韩91 | 99久久久久免费精品国产 | 亚洲天天综合 | 99久久久久久久久 | 免费三级影片 | 日韩国产欧美在线播放 | 国产黄影院色大全免费 | 国产尤物在线视频 | 96视频免费在线观看 | 久久一区二区免费视频 | 亚洲精品日韩在线观看 | 精品国产免费一区二区三区五区 | 中文字幕在线视频第一页 | 一区二区三区av在线 | 精品在线视频观看 | 伊人婷婷综合 | 1区2区3区在线观看 三级动图 | 久久国产精品免费 | 天天综合成人 | www.国产高清 | 91视频在线观看免费 | 色先锋av资源中文字幕 | 五月激情片 | 成人av资源在线 | 国产精品欧美久久久久三级 | 国产亚洲精品福利 | 天天天天天天天天操 | 精品国产_亚洲人成在线 | 在线免费视频一区 | 日韩欧美一区二区三区在线观看 | 中文在线免费观看 | 日韩v欧美v日本v亚洲v国产v | 色.www| 九九热只有这里有精品 | 亚洲欧美视频在线播放 | 97在线精品 | 麻豆91在线 | 久久电影网站中文字幕 | 国产高清第一页 | 久久久久99精品国产片 | 欧美一级久久 | 精品成人a区在线观看 | 成年免费在线视频 | 日批在线看 | 午夜日b视频 | 国产黄色免费看 | 免费看色的网站 | 黄色官网在线观看 | av不卡网站| 中文字幕av最新 | 亚洲va在线va天堂 | 人人爽人人爽人人爽学生一级 | 日黄网站| 91成人网在线观看 | 亚洲欧美国产精品久久久久 | 91禁在线观看 | 色综合久久久久综合体桃花网 | 91麻豆精品国产91久久久久 | 成人黄色免费观看 | 成人免费观看在线视频 | 日韩欧美亚洲 | 欧美在线视频一区二区三区 | 91成人黄色 | 日本久久免费视频 | 亚洲香蕉在线观看 | 黄色av高清 | 国产精品成人自产拍在线观看 | 久久婷婷一区二区三区 | 久久精品牌麻豆国产大山 | 日韩一二区在线 | 91精品视频在线免费观看 | 日韩精品亚洲专区在线观看 | 久久综合九色综合欧美狠狠 | 超碰人人在 | 精品影院| wwwwww黄| 精品无人国产偷自产在线 | 日韩专区一区二区 | 激情欧美国产 | 在线免费观看视频一区 | 日韩一区在线播放 | 日韩亚洲在线观看 | 国产小视频在线观看免费 | 亚洲欧洲精品一区二区 | 人人干在线观看 | 日韩av高清 | 最新婷婷色 | 久久精品久久久久电影 | 亚洲成人动漫在线观看 | 人人干干人人 | 免费观看完整版无人区 | 久久久久久久久久久久99 | 91精品伦理| 精品欧美一区二区三区久久久 | 亚洲 欧美变态 另类 综合 | 免费能看的黄色片 | 怡红院av| 麻豆视频免费入口 | 成人精品国产免费网站 | 婷婷中文字幕 | 精品福利在线视频 | 日韩视频中文字幕在线观看 | 成年人在线免费看片 | 黄色网大全 | 综合国产视频 | 欧美日韩精品电影 | 国产不卡网站 | 久久精品9| 婷婷丁香视频 | 精品国产乱码久久久久久浪潮 | 最新av在线播放 | 免费看的黄色 | www激情网 | 99r精品视频在线观看 | 亚洲国产精彩中文乱码av | 中文字幕电影在线 | 亚洲精品久久久久久国 | 久久久亚洲国产精品麻豆综合天堂 | 国产日韩在线看 | 亚洲精品456在线播放 | 青草视频在线看 | 狠狠网站 | 91免费视频国产 | 人人插人人 | 一区在线免费观看 | 日本中文不卡 | 久草网首页 | 激情小说 五月 | 国产成人a v电影 | 色妞色视频一区二区三区四区 | 99热播精品 | 婷婷久月 | 91av网址 | 伊人久久在线观看 | 精品日韩在线 | 色综合天天综合网国产成人网 | 色偷偷88888欧美精品久久久 | 久久99在线| 欧美成人中文字幕 | 欧美影片| 在线免费观看不卡av | 亚洲2019精品 | 丁香花在线观看免费完整版视频 | 久热色超碰 | av一本久道久久波多野结衣 | 欧美日韩另类在线观看 | 成人在线黄色 | 亚洲精品色视频 | 精品国产日本 | 2023年中文无字幕文字 | 中文字幕久久久精品 | 婷婷丁香久久五月婷婷 | 色综合久久五月 | 久久私人影院 | 久久精品99久久 | 狠狠五月婷婷 | 丁香六月激情婷婷 | 亚洲国产中文字幕在线 | 国产aaa大片| 久艹视频在线免费观看 | 日本一区二区免费在线观看 | 久草影视在线观看 | 午夜在线看片 | 亚洲美女免费视频 | 久久激情影院 | 99久久精品日本一区二区免费 | 天天射天天干天天爽 | 国产精品黑丝在线观看 | 一区二区三区四区五区在线视频 | 日韩精品在线视频 | 色香网 | 五月天com| 国产色网站 | av一区二区三区在线观看 | 精品视频区 | 色瓜 | 久久精品79国产精品 | 日韩精品不卡 | 97碰碰精品嫩模在线播放 | 黄网站www | 国产一区在线看 | 免费黄色一区 | 免费在线观看av | 2024av| 国产精品人人做人人爽人人添 | 99精彩视频在线观看免费 | 精品xxx | 亚洲电影网站 | 日日久视频 | 99精品免费 | 91av福利视频 | 欧美日韩精品在线观看 | 国产又粗又长又硬免费视频 | 久久久久久久久福利 | 九九色综合 | 天天天天天天操 | 91视频免费国产 | 99在线视频精品 | 成人免费观看av | 日韩欧美高清一区二区 | www.香蕉视频 | 久久久久一区 | 欧美成年网站 | 国产亚洲日本 | 久久爽久久爽久久av东京爽 | 91网在线 | 亚洲欧美激情精品一区二区 | 视频在线在亚洲 | 国产精品尤物视频 | 成人app在线免费观看 | 91资源在线播放 | 九九免费在线观看视频 | 亚洲欧美精品一区 | 欧美日韩后 | 国产日产精品一区二区三区四区的观看方式 | 免费国产ww | 99久热精品 | 婷婷中文在线 | 日韩成人中文字幕 | 玖玖色在线观看 | 天天综合网在线观看 | 91亚洲精品久久久蜜桃 | 免费男女羞羞的视频网站中文字幕 | 精品国产一区二区三区免费 | 欧美日韩不卡在线 | 亚洲精品国产欧美在线观看 | 色亚洲网 | 中文字幕免费高 | 精品国内 | 91精品成人 | 97超视频免费观看 | 一区二区三区四区五区在线视频 | 国产精品一区二区久久 | 国产一区二区日本 | 国产又粗又长又硬免费视频 | 国产色综合 | 五月天中文字幕mv在线 | 天天天天天天干 | av线上看 | 日本资源中文字幕在线 | 亚洲激情六月 | 天天鲁一鲁摸一摸爽一爽 | 亚洲精品国产自产拍在线观看 | 国产免费亚洲高清 | 在线观看中文字幕av | 91免费观看视频网站 | 欧美性生活一级片 | 亚洲高清视频在线播放 | 国产成人一区二区精品非洲 | 五月综合网 | 国产一级在线视频 | 国产精品va最新国产精品视频 | 亚洲国产精品va在线看黑人动漫 | 精品色999 | 欧美日韩不卡一区二区 | 国产精品美女久久久 | 日韩精品一区在线播放 | 欧美日本在线观看视频 | 国产精品二区三区 | 久久人人爽人人爽人人片 | 天天爱天天射天天干天天 | 中文字幕电影在线 | 欧美一级视频在线观看 | 国产精品一区在线观看 | 国内丰满少妇猛烈精品播放 | 97在线看片| 这里只有精品视频在线观看 | 欧美精品久久久久性色 | 精品视频999 | 人九九精品| 中文区中文字幕免费看 | 国产免费大片 | www.99久久.com | 99婷婷| 国产中文字幕视频 | www.五月天| av软件在线观看 | 天天爽夜夜爽精品视频婷婷 | 99热在线国产精品 | 在线观看免费黄色 | 久久69av | 国产福利免费看 | 久久国产网| 亚洲第一区在线播放 | 黄色软件视频网站 | 97电影网站 | 亚洲影音先锋 | 欧美精品在线观看一区 | 在线免费视频你懂的 | 国产999视频在线观看 | 激情av网址 | 夜又临在线观看 | 精一区二区 | 亚洲精品成人在线 | 97视频免费观看2区 亚洲视屏 | av电影在线播放 | 色婷婷伊人 | 在线岛国av | 精品国模一区二区三区 | 日韩久久影院 | 99精品在线免费观看 | 国产v在线播放 | 婷婷av电影 | 在线免费黄色av | 天海翼一区二区三区免费 | 麻豆影视网 | 激情久久小说 | 欧洲一区精品 | 欧美一区二视频在线免费观看 | 午夜精品99久久免费 | 亚洲欧美视频在线观看 | 婷婷网址| 国产精品va最新国产精品视频 | 久久露脸国产精品 | 黄色毛片在线观看 | 免费观看av| 久久综合精品国产一区二区三区 | 最近日韩免费视频 | 久久99久久久久久 | 国产美女精品人人做人人爽 | 色老板在线视频 | 日本中文字幕一二区观 | 精品国产电影 | 久久黄网站 | 久久视频中文字幕 | 国产va在线| 性色av香蕉一区二区 | 婷婷丁香社区 | 极品久久久久 | 91网在线看| 玖玖在线免费视频 | 中文字幕在线观看第一区 | 久久久久亚洲精品男人的天堂 | 国产成人精品国内自产拍免费看 | 天天综合久久综合 | 在线观看香蕉视频 | 成人a视频片观看免费 | 在线不卡中文字幕播放 | 69国产精品成人在线播放 | 亚洲伦理一区二区 | 在线网站黄| 日韩av视屏 | 久久久国产精华液 | 国产高潮久久 | 久久99免费 | 最新一区二区三区 | 国产在线无| 国产精品2018 | 开心色插| 天天做天天射 | av福利在线看 | 又黄又爽又色无遮挡免费 | 91丨九色丨勾搭 | 丁香六月中文字幕 | 亚洲91视频 | 人人干天天干 | 欧美性猛片, | 少妇bbbb搡bbbb桶 | 久久手机免费视频 | 久久国产亚洲视频 | 波多野结衣在线观看视频 | 99热999| 青青草国产在线 | 丁香花中文在线免费观看 | 天天插狠狠干 | 一区二区三区免费在线观看视频 | 婷婷六月激情 | 国产日韩在线播放 | 99在线视频播放 | 日本黄色免费网站 | 午夜国产在线 | 国产精品69av | 国产精品久久麻豆 | 黄色中文字幕在线 | 在线观看免费一区 | 特级黄色片免费看 | 中文字幕美女免费在线 | 中文一区二区三区在线观看 | 日韩精品中文字幕av | 久久,天天综合 | 久久久久黄 | 日本三级在线观看中文字 | 伊甸园永久入口www 99热 精品在线 | wwwwwww色| 久久精品99精品国产香蕉 | www色com| 国产精品免费一区二区 | 精品国产一区在线观看 | 久草电影网 | 欧美色婷 | 男女免费av| 久久亚洲综合国产精品99麻豆的功能介绍 | 亚洲永久精品在线 | 国产精品ssss在线亚洲 | 国产精彩在线视频 | 午夜国产在线 | 国产视频中文字幕在线观看 | 黄色在线看网站 | 免费日韩 精品中文字幕视频在线 | 亚洲视频精品 | 国产一区二区久久久 | 91亚色视频 | 亚洲午夜在线视频 | 日韩高清黄色 | 超碰在线最新地址 | 久久国产91| 国产精品美女久久久久久2018 | 国产成人精品一区二区在线 | 天天色天天综合网 | 日本黄区免费视频观看 | 91免费视频国产 | 亚洲精品成人网 | 亚洲午夜久久久久久久久电影网 | 国产精品一区二区久久精品爱微奶 | 色www.| 亚洲 中文 在线 精品 | 国产欧美久久久精品影院 | 久久免费黄色网址 | 在线观看视频三级 | www.超碰| 天天夜操 | 可以免费观看的av片 | 成人一级免费视频 | 亚洲aⅴ在线观看 | 夜色资源网| 久久人人爽人人片av | 国产高清第一页 | 在线成人免费电影 | 西西www4444大胆在线 | 97超级碰碰碰视频在线观看 | 综合婷婷 | www日韩在线观看 | 99久久精品费精品 | 四虎成人精品永久免费av | 亚洲激情 欧美激情 | 青春草免费视频 | 中文资源在线官网 | 91欧美日韩国产 | 日韩性网站 | 国产精成人品免费观看 | 91精品视频播放 | 亚洲综合色婷婷 | 91香蕉视频色版 | 色综合五月 | 国产午夜精品视频 | 久久成人国产精品免费软件 | 久久人人爽人人片av | 成人午夜影院在线观看 | 亚洲成 人精品 | av中文在线影视 | 六月色婷 | 国产精品视频线看 | 91人人澡人人爽人人精品 | 99久久99久国产黄毛片 | av网在线观看 | 欧美精品在线观看 | 亚洲成人精品国产 | 国产一区二区三区四区在线 | 欧美日韩在线免费观看视频 | 国语自产偷拍精品视频偷 | 一级特黄av| 亚洲电影院 | 久久久久成人精品 | 国产精品video爽爽爽爽 | 99久久久久免费精品国产 | 狠狠躁夜夜av| 国产高清视频在线播放一区 | 狠狠色丁香婷婷 | 亚洲一区二区视频 | 啪啪小视频网站 | 99国产精品免费网站 | 在线精品国产 | 缴情综合网五月天 | 国产精品18久久久久vr手机版特色 | 插综合网| 人人爽人人澡人人添人人人人 | 91视频 - 114av| 91av视频在线免费观看 | 欧美日韩国产精品一区 | 在线精品视频在线观看高清 | 精品国产一区二区三区久久久久久 | 精品一二三四五区 | 黄网站免费久久 | 国产色综合 | 18国产精品白浆在线观看免费 | 91高清完整版在线观看 | 在线视频福利 | 日日射天天射 | 色婷婷免费视频 | 免费视频你懂的 | 国产精品久久久久久一二三四五 | 久久久久久国产精品亚洲78 | 在线观看91精品国产网站 | 午夜丰满寂寞少妇精品 | 麻豆高清免费国产一区 | 亚洲精品白浆高清久久久久久 | 韩国一区二区三区在线观看 | 九色视频网 | 日韩视频一 | av一级片在线观看 | 精品在线观看国产 | 亚洲伊人av| 日韩在线观看一区二区三区 | 天堂av在线免费观看 | 91大神免费在线观看 | 久草免费福利在线观看 | 久久精品4 | 麻豆超碰| 伊人中文在线 | 国产视频一区在线播放 | 欧美最猛性xxx | 亚洲免费一级电影 | 国产精品成人av久久 | 国产一区久久久 | 日韩视频中文字幕 | 亚洲国产三级 | 97爱 | 久久免费高清视频 | 色综合婷婷 | 久久精品视频播放 | 久久精品国产成人精品 | 二区视频在线观看 | 中文在线天堂资源 | 超碰在线观看av | 天天天天干 | 久草视频在线免费播放 | 91福利社区在线观看 | 午夜精品久久久久久久99热影院 | 久久久黄色免费网站 | 麻豆精品在线 | 麻豆国产在线播放 | 久久久国产影院 | 精品超碰| 亚洲精品视频一 | av大片免费在线观看 | 欧美久草在线 | 在线看国产视频 | 国产麻豆剧传媒免费观看 | 日韩亚洲在线 | 国产无套一区二区三区久久 | 中文字幕视频免费观看 | 97在线视频观看 | 日本精品一 | 91视频网址入口 | 国产白浆在线观看 | av色图天堂网| 久久国产精品免费 | 国产在线观看av | 亚洲va欧美va人人爽 | 中文字幕日韩电影 | 亚洲va综合va国产va中文 | 最近中文字幕免费av | 久久国语| 国产探花在线看 | 国产成人精品久久久 | 91在线永久| 激情图片qvod | 天天爽天天碰狠狠添 | 9999精品免费视频 | 在线观看的a站 | 成人在线视频一区 | 国产99久久久久 | www天天干com | 在线午夜av | 欧美一级黄色网 | 天天干天天干天天色 | 国产精品一区二区免费在线观看 | 久久久免费看 | 亚洲最大激情中文字幕 | 天天操天天是 | 黄色日本免费 | 国产盗摄精品一区二区 | 在线观看视频99 | 成人香蕉视频 | 免费观看一区二区三区视频 | 91漂亮少妇露脸在线播放 | 久久免费看 | 久久国产福利 | 最近最新最好看中文视频 | 一区 在线观看 | 99视频国产在线 | 992tv在线成人免费观看 | 日韩精品免费一线在线观看 | 久久亚洲精品国产亚洲老地址 | 婷婷干五月 | 国产午夜精品在线 | 超碰免费成人 | 69国产精品视频 | 亚洲 欧美 变态 国产 另类 | 日韩国产欧美在线视频 | 天天婷婷 | 国产精品视频免费在线观看 | 日韩网站免费观看 | 欧美色婷| 成人免费观看视频网站 | 久久久午夜电影 | 亚洲激情六月 | 最新中文字幕在线资源 | 国产精品二区在线 | 亚洲国产成人精品电影在线观看 | 亚洲午夜精品久久久 | 午夜精品久久久久久久99 | 欧美国产精品久久久久久免费 | 久久理论片 | 日韩视频免费观看高清 | 欧美日韩后 | 麻豆传媒视频在线播放 | 免费三级骚 | 国产亚洲成av人片在线观看桃 | 人人澡人人添人人爽一区二区 | 国产 在线观看 | 午夜黄色| 国产网红在线观看 | 久久国产精品久久精品国产演员表 | 成人免费网站在线观看 | 欧美最猛性xxx | 91尤物国产尤物福利在线播放 | 国产亚洲91 | 91日韩精品视频 | 亚洲人成人99网站 | 亚洲国内在线 | 久久国产精品99久久久久久老狼 | 一级片免费观看 | 中文一区在线 | 国产毛片久久久 | 成人cosplay福利网站 | 91亚洲精品久久久中文字幕 | 久草综合在线观看 | 久久激情片 | 免费黄a| 国产精品99久久久久久久久 | 偷拍区另类综合在线 | 亚洲精品一区二区18漫画 | 国产亚洲精品bv在线观看 | 一区二区三区在线影院 | 久草视频国产 | 黄色成人免费电影 | 欧美日韩一区二区三区不卡 | 91精品成人 | 欧美在线观看视频一区二区 | 天天射天天色天天干 | 久久久麻豆| 麻豆 videos| 中文字幕人成不卡一区 | 欧美日韩免费视频 | 国产高清中文字幕 | 中文字幕一区二区三区乱码不卡 | 国产精品人人做人人爽人人添 | 一级欧美黄 | 成人亚洲免费 | 日韩天堂网 | 欧洲精品在线视频 | 久草在线高清 | 欧美另类色图 | 国产精品国产三级国产不产一地 | 国产视频一区二区在线观看 | 国产精彩在线视频 | av成年人电影 | 日韩视频免费观看高清完整版在线 | 亚洲最新av | 日批在线看 | 狠狠狠狠狠狠狠狠干 | sesese图片| 亚洲专区欧美 | 精品久久一区二区三区 | 国产乱码精品一区二区三区介绍 | 亚洲欧洲av | 黄色一级在线免费观看 | 美女国产网站 | 99re热精品视频 | 天天操天天操天天操天天 | 午夜三级大片 | 欧美天堂影院 | 韩国av永久免费 | 美女激情影院 | 96国产精品 | 久久综合影音 | 精产嫩模国品一二三区 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产中文字幕国产 |