精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C# AsyncLocal 是如何實(shí)現(xiàn) Thread 間傳值

開(kāi)發(fā) 前端
說(shuō)了這么多,其實(shí)精妙之處在于創(chuàng)建OS線程的時(shí)候,會(huì)把C# Thread實(shí)例(coreclr對(duì)應(yīng)線程) 作為參數(shù)傳遞給新線程,即下面方法簽名中的 lpParameter? 參數(shù),新線程拿到了Thread實(shí)例,自然就能獲取到被調(diào)用線程賦值的 Thread._executionContext 字段,所以這是完完全全的C#層面玩法,希望能給后來(lái)者解惑吧!

一:背景

1. 講故事

這個(gè)問(wèn)題的由來(lái)是在.NET高級(jí)調(diào)試訓(xùn)練營(yíng)第十期分享ThreadStatic底層玩法的時(shí)候,有朋友提出了AsyncLocal是如何實(shí)現(xiàn)的,雖然做了口頭上的表述,但總還是會(huì)不具體,所以覺(jué)得有必要用文字+圖表的方式來(lái)系統(tǒng)的說(shuō)一下這個(gè)問(wèn)題。

二:AsyncLocal 線程間傳值

1. 線程間傳值途徑

在 C# 編程中實(shí)現(xiàn)多線程以及線程切換的方式大概如下三種:

  • Thread
  • Task
  • await,async

這三種場(chǎng)景下的線程間傳值有各自的實(shí)現(xiàn)方式,由于篇幅限制,先從 Thread 開(kāi)始聊吧。本質(zhì)上來(lái)說(shuō) AsyncLocal 是一個(gè)純托管的C#玩法,和 coreclr,Windows 沒(méi)有任何關(guān)系。

2. Thread 小例子

為了方便講述,先來(lái)一個(gè)例子看下如何在新Thread線程中提取 _asyncLocal 中的值,參考代碼如下:

internal class Program
    {
        static AsyncLocal<int> _asyncLocal = new AsyncLocal<int>();

        static void Main(string[] args)
        {
            _asyncLocal.Value = 10;

            var t = new Thread(() =>
            {
                Console.WriteLine($"Tid={Thread.CurrentThread.ManagedThreadId}, AsyncLocal value: {_asyncLocal.Value},");
                Debugger.Break();
            });

            t.Start();

            Console.ReadLine();
        }
    }

圖片圖片

從截圖看 tid=7 線程果然拿到了 主線程設(shè)置的 10 ,哈哈,是不是充滿了好奇心?接下來(lái)逐一分析下吧。

3. 流轉(zhuǎn)分析

首先觀察下 _asyncLocal.Value = 10 在源碼層做了什么,參考代碼如下:

public T Value
    {
        set
        {
            ExecutionContext.SetLocalValue(this, value, m_valueChangedHandler != null);
        }
    }

    internal static void SetLocalValue(IAsyncLocal local, object newValue, bool needChangeNotifications)
    {
        ExecutionContext executionContext = Thread.CurrentThread._executionContext;

        Thread.CurrentThread._executionContext = new ExecutionContext(asyncLocalValueMap, array, flag2));
    }

從源碼中可以看到這個(gè) 10 最終封印在 Thread.CurrentThread._executionContext 字段中,接下來(lái)就是核心問(wèn)題了,它是如何被送到新線程中的呢?

其實(shí)仔細(xì)想一想,要讓我實(shí)現(xiàn)的話,我肯定這么實(shí)現(xiàn)。

  • 將主線程的 _executionContext 字段賦值給新線程 t._executionContext 字段。
  • 將 var t = new Thread() 中的t作為參數(shù)傳遞給 win32 的 CreateThread 函數(shù),這樣在新線程中就可以提取 到 t 了,然后執(zhí)行 t 的callback。

這么說(shuō)大家可能有點(diǎn)抽象,我就直接畫(huà)下C#是怎么流轉(zhuǎn)的圖吧:

圖片圖片

有了這張圖之后接下來(lái)的問(wèn)題就是驗(yàn)證了,首先看一下 copy 操作在哪里?可以觀察下 Start 源碼。

private void Start(bool captureContext)
    {
        StartHelper startHelper = _startHelper;
        if (startHelper != null)
        {
            startHelper._startArg = null;
            startHelper._executionContext = (captureContext ? System.Threading.ExecutionContext.Capture() : null);
        }
        StartCore();
    }
    public static ExecutionContext? Capture()
    {
        ExecutionContext executionContext = Thread.CurrentThread._executionContext;
        return executionContext;
    }

從源碼中可以看到將主線程的 _executionContext 字段給了新線程t下的startHelper._executionContext 。

接下來(lái)我們觀察下在創(chuàng)建 OS 線程的時(shí)候是不是將 Thread 作為參數(shù)傳過(guò)去了,如果傳過(guò)去了,那就可以直接在新線程中拿到 Thread._startHelper._executionContext 字段,驗(yàn)證起來(lái)也很簡(jiǎn)單,在win32 的 ntdll!NtCreateThreadEx 上下一個(gè)斷點(diǎn)即可。

0:000> bp ntdll!NtCreateThreadEx
0:000> g
Breakpoint 1 hit
ntdll!NtCreateThreadEx:
00007ff9`0fe8e8c0 4c8bd1          mov     r10,rcx
0:000> r
rax=00007ff8b4a529d0 rbx=0000000000000000 rcx=0000008471b7df28
rdx=00000000001fffff rsi=0000027f2ca25b01 rdi=0000027f2ca25b60
rip=00007ff90fe8e8c0 rsp=0000008471b7de68 rbp=00007ff8b4a529d0
 r8=0000000000000000  r9=ffffffffffffffff r10=0000027f2c8a0000
r11=0000008471b7de40 r12=0000008471b7e890 r13=0000008471b7e4f8
r14=ffffffffffffffff r15=0000000000010000
iopl=0         nv up ei pl nz na po nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000206
ntdll!NtCreateThreadEx:
00007ff9`0fe8e8c0 4c8bd1          mov     r10,rcx
0:000> !t
ThreadCount:      4
UnstartedThread:  1
BackgroundThread: 2
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                                                                                            Lock  
 DBG   ID     OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception
   0    1     2cd8 0000027F2C9E6610    2a020 Preemptive  0000027F2E5DB438:0000027F2E5DB4A0 0000027f2c9dd670 -00001 MTA 
   6    2     2b24 0000027F2CA121E0    21220 Preemptive  0000000000000000:0000000000000000 0000027f2c9dd670 -00001 Ukn (Finalizer) 
   7    3     2658 0000027F4EAA0AE0    2b220 Preemptive  0000000000000000:0000000000000000 0000027f2c9dd670 -00001 MTA 
XXXX    4        0 0000027F2CA25B60     9400 Preemptive  0000000000000000:0000000000000000 0000027f2c9dd670 -00001 Ukn

從輸出中可以看到 NtCreateThreadEx 方法的第二個(gè)參數(shù)即 rdi=0000027f2ca25b60 就是我們的托管線程,如果你不相信的話可以再用 windbg 找到它的托管線程信息,輸出如下:

0:000> dt coreclr!Thread 0000027F2CA25B60 -y m_ExposedObject
   +0x1c8 m_ExposedObject : 0x0000027f`2c8f11d0 OBJECTHANDLE__

0:000> !do poi(0x0000027f`2c8f11d0)
Name:        System.Threading.Thread
MethodTable: 00007ff855090d78
EEClass:     00007ff85506a700
Tracked Type: false
Size:        72(0x48) bytes
File:        C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.25\System.Private.CoreLib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ff8550c76d8  4000b35        8 ....ExecutionContext  0 instance 0000000000000000 _executionContext
0000000000000000  4000b36       10 ...ronizationContext  0 instance 0000000000000000 _synchronizationContext
00007ff85508d708  4000b37       18        System.String  0 instance 0000000000000000 _name
00007ff8550cb9d0  4000b38       20 ...hread+StartHelper  0 instance 0000027f2e5db3b0 _startHelper
...

有些朋友可能要說(shuō),你現(xiàn)在的 _executionContext 字段是保留在 _startHelper 類里,并沒(méi)有賦值到Thread._executionContext字段呀?那這一塊在哪里實(shí)現(xiàn)的呢?從上圖可以看到其實(shí)是在新線程的執(zhí)行函數(shù)上,在托管函數(shù)執(zhí)行之前會(huì)將 _startHelper._executionContext 賦值給 Thread._executionContext , 讓 windbg 繼續(xù)執(zhí)行,輸出如下:

0:009> k
 # Child-SP          RetAddr               Call Site
00 00000084`728ff778 00007ff8`b4c23d19     KERNELBASE!wil::details::DebugBreak+0x2
01 00000084`728ff780 00007ff8`b43ba7ea     coreclr!DebugDebugger::Break+0x149 [D:\a\_work\1\s\src\coreclr\vm\debugdebugger.cpp @ 148] 
02 00000084`728ff900 00007ff8`54ff56e3     System_Private_CoreLib!System.Diagnostics.Debugger.Break+0xa [/_/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs @ 18] 
03 00000084`728ff930 00007ff8`b42b4259     ConsoleApp9!ConsoleApp9.Program.<>c.<Main>b__1_0+0x113
04 00000084`728ff9c0 00007ff8`b42bddd9     System_Private_CoreLib!System.Threading.Thread.StartHelper.Callback+0x39 [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Thread.cs @ 42] 
05 00000084`728ffa00 00007ff8`b42b2f4a     System_Private_CoreLib!System.Threading.ExecutionContext.RunInternal+0x69 [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs @ 183] 
06 00000084`728ffa70 00007ff8`b4b7ba53     System_Private_CoreLib!System.Threading.Thread.StartCallback+0x8a [/_/src/coreclr/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs @ 105] 
07 00000084`728ffab0 00007ff8`b4a763dc     coreclr!CallDescrWorkerInternal+0x83
08 00000084`728ffaf0 00007ff8`b4b5e713     coreclr!DispatchCallSimple+0x80 [D:\a\_work\1\s\src\coreclr\vm\callhelpers.cpp @ 220] 
09 00000084`728ffb80 00007ff8`b4a52d25     coreclr!ThreadNative::KickOffThread_Worker+0x63 [D:\a\_work\1\s\src\coreclr\vm\comsynchronizable.cpp @ 158] 
...
0d (Inline Function) --------`--------     coreclr!ManagedThreadBase_FullTransition+0x2d [D:\a\_work\1\s\src\coreclr\vm\threads.cpp @ 7569] 
0e (Inline Function) --------`--------     coreclr!ManagedThreadBase::KickOff+0x2d [D:\a\_work\1\s\src\coreclr\vm\threads.cpp @ 7604] 
0f 00000084`728ffd60 00007ff9`0e777614     coreclr!ThreadNative::KickOffThread+0x79 [D:\a\_work\1\s\src\coreclr\vm\comsynchronizable.cpp @ 230] 
10 00000084`728ffdc0 00007ff9`0fe426a1     KERNEL32!BaseThreadInitThunk+0x14
11 00000084`728ffdf0 00000000`00000000     ntdll!RtlUserThreadStart+0x21
...

在上面的回調(diào)函數(shù)中看的非常清楚,在執(zhí)行托管函數(shù) <Main>b__1_0 之前執(zhí)行了一個(gè) ExecutionContext.RunInternal 函數(shù),對(duì),就是它來(lái)實(shí)現(xiàn)的,參考代碼如下:

private sealed class StartHelper
    {
        internal void Run()
        {
            System.Threading.ExecutionContext.RunInternal(_executionContext, s_threadStartContextCallback, this);
        }
    }

    internal static void RunInternal(ExecutionContext executionContext, ContextCallback callback, object state)
    {
        Thread currentThread = Thread.CurrentThread;
        RestoreChangedContextToThread(currentThread, executionContext, executionContext3);
    }

    internal static void RestoreChangedContextToThread(Thread currentThread, ExecutionContext contextToRestore, ExecutionContext currentContext)
    {
        currentThread._executionContext = contextToRestore;
    }

既然將 StartHelper.executionContext 塞到了 currentThread._executionContext 中,在 <Main>b__1_0 方法中自然就能通過(guò) _asyncLocal.Value 提取了。

三:總結(jié)

說(shuō)了這么多,其實(shí)精妙之處在于創(chuàng)建OS線程的時(shí)候,會(huì)把C# Thread實(shí)例(coreclr對(duì)應(yīng)線程) 作為參數(shù)傳遞給新線程,即下面方法簽名中的 lpParameter 參數(shù),新線程拿到了Thread實(shí)例,自然就能獲取到被調(diào)用線程賦值的 Thread._executionContext 字段,所以這是完完全全的C#層面玩法,希望能給后來(lái)者解惑吧!

HANDLE CreateThread(
  [in, optional]  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  [in]            SIZE_T                  dwStackSize,
  [in]            LPTHREAD_START_ROUTINE  lpStartAddress,
  [in, optional]  __drv_aliasesMem LPVOID lpParameter,
  [in]            DWORD                   dwCreationFlags,
  [out, optional] LPDWORD                 lpThreadId
);


責(zé)任編輯:武曉燕 來(lái)源: 一線碼農(nóng)聊技術(shù)
相關(guān)推薦

2009-09-07 03:44:50

C#窗體間傳值

2009-09-07 03:58:42

WinForm傳值

2009-08-04 17:08:12

C# Thread類

2009-08-26 16:58:12

調(diào)用C# Thread

2009-08-26 15:09:57

C# Hook

2009-08-19 14:29:33

C#代理

2012-06-29 13:31:56

ServletJSPJava

2009-07-30 18:50:32

C#發(fā)送消息C#應(yīng)用程序

2010-05-11 16:55:12

Windows Pho

2009-06-16 10:20:05

多繼承C#

2009-09-10 17:48:05

C# button

2009-03-12 13:49:30

DataTemplatWPFC#

2009-09-01 18:06:06

c#保存窗體狀態(tài)

2013-07-05 15:05:42

Windows PhoWP頁(yè)面間傳值方法

2009-09-08 16:01:58

C# ListBox

2009-08-19 17:10:09

C#回調(diào)函數(shù)

2009-09-10 12:00:09

C# listbox

2009-09-08 22:53:39

c# textbox數(shù)

2009-08-31 14:45:13

C#注冊(cè)表

2009-09-01 17:51:47

C#拆箱C#裝箱
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

69av在线播放| 欧美成人精品高清在线播放| 亚洲国产精品综合| 国产又粗又猛视频免费| 欧美午夜精品| 亚洲午夜小视频| 波多野结衣网页| 欧美xxxhd| 中文字幕一区二区日韩精品绯色| 草莓视频一区| 久久久精品毛片| 欧美成人综合| 亚洲视频在线播放| 国产精品熟妇一区二区三区四区 | 国产日产欧美一区二区三区| 亚洲自拍偷拍色片视频| 天堂网免费视频| 亚洲欧美综合国产精品一区| 亚洲色图13p| 91精品人妻一区二区三区蜜桃2| 欧美aa视频| 亚洲综合一二区| 亚洲在线色站| 日本一卡二卡四卡精品| 国产乱理伦片在线观看夜一区| 日本欧美精品在线| 久久综合色综合| 久久精品青草| 国产亚洲精品激情久久| 中文字幕三级电影| 精品亚洲a∨一区二区三区18| 色噜噜偷拍精品综合在线| 日本wwwcom| 激情在线小视频| 日本一区二区三区久久久久久久久不 | 成人精品视频网站| 成人综合网网址| 国内av在线播放| 亚欧成人精品| 欧美性受xxx| 日韩高清精品免费观看| 亚洲五月综合| 麻豆乱码国产一区二区三区| 亚洲色图日韩精品| 精品国产一区二区三区久久久樱花| 亚洲精品一区二区三区99| 国产裸体视频网站| 国产专区精品| 欧美一区二区三区成人| 亚洲妇熟xx妇色黄蜜桃| 亚洲精品成a人ⅴ香蕉片| 欧美亚洲自拍偷拍| 免费观看成人网| 中文字幕高清在线播放| 欧美日韩国产精品| 国产在线青青草| 三妻四妾完整版在线观看电视剧| 午夜a成v人精品| 亚洲熟妇无码一区二区三区| heyzo高清在线| 五月婷婷综合网| 自拍日韩亚洲一区在线| 免费一二一二在线视频| 欧美性黄网官网| 不卡影院一区二区| 日韩欧美一区二区三区免费观看| 欧美综合欧美视频| 日韩av在线中文| 亚洲伦理网站| 日韩限制级电影在线观看| 中文字幕人妻无码系列第三区| 亚洲亚洲一区二区三区| 亚洲国产精品网站| 中文字幕5566| 欧美亚洲国产一区| 久久色精品视频| 69xx绿帽三人行| 亚洲激情偷拍| 欧美一级免费看| 亚洲系列在线观看| 粉嫩av亚洲一区二区图片| 久久99蜜桃综合影院免费观看| 你懂的视频在线观看| 中文字幕第一区| 精品嫩模一区二区三区| 2019中文字幕在线电影免费| 色综合一个色综合| 成人黄色一级大片| 精品国产一区二区三区不卡蜜臂| 亚洲欧美日韩中文在线制服| 亚洲视频重口味| a91a精品视频在线观看| 国产区精品在线观看| 黄色小视频免费观看| www久久精品| 国产一二三四五| 欧美办公室脚交xxxx| 欧美日韩免费观看一区二区三区 | av成人资源网| 国产一区二区三区在线免费观看| 国产又粗又硬又长又爽| 亚洲尤物影院| 91精品视频在线看| 邻居大乳一区二区三区| 亚洲精品视频观看| 亚洲男人天堂色| 91精品国产自产在线丝袜啪| 亚洲最新av在线网站| 日本一区二区三区免费视频| 蜜乳av一区二区| 精品国产一区二区三区麻豆小说| 免费网站黄在线观看| 欧美日韩午夜剧场| 亚洲在线观看网站| 日韩欧美视频专区| 欧美孕妇与黑人孕交| 亚洲精品中文字幕成人片| 欧美国产欧美综合| 国产欧美在线一区| 波多野结衣欧美| 欧美成人精品h版在线观看| 波多野结衣网站| 92精品国产成人观看免费 | 久久精品综合| 国产欧美一区二区在线播放| 好操啊在线观看免费视频| 欧洲生活片亚洲生活在线观看| 永久免费未满蜜桃| 欧美日本在线| 亚洲自拍高清视频网站| 在线免费观看黄色| 色美美综合视频| 波多野结衣办公室33分钟| 亚洲午夜黄色| 97伦理在线四区| 久操视频在线免费播放| 欧美日本一区二区三区| 亚洲国产精品久久艾草纯爱| 国内一区在线| 久草在线新免费首页资源站| 日韩一区二区中文字幕| 国产精品白丝喷水在线观看| 久久成人麻豆午夜电影| 婷婷五月色综合| 福利精品在线| 中文字幕在线日韩| 一区二区 亚洲| 中文文精品字幕一区二区| 国产精品人人妻人人爽人人牛| 香蕉久久夜色精品国产使用方法 | 午夜精品成人av| 亚洲精品在线91| 天天操夜夜操视频| 久久综合久久久久88| 国产a级一级片| 国产成人ay| 国产精品女人网站| av网站在线播放| 欧美日韩在线播放一区| 九九这里只有精品视频| 激情成人午夜视频| 伊人再见免费在线观看高清版| 亚洲啊v在线免费视频| 欧美精品videosex性欧美| 国产香蕉在线观看| 欧美性猛交xxxxx水多| 色欲AV无码精品一区二区久久| 日韩国产欧美一区二区三区| 亚洲人成人77777线观看| 99视频这里有精品| 欧美极品第一页| 天堂av资源在线| 色久优优欧美色久优优| 国产精品久久久免费看| 国产91精品一区二区麻豆亚洲| 水蜜桃色314在线观看| 婷婷亚洲成人| 国产精品嫩草影院久久久| 中文字幕免费高清电视剧网站在线观看| 日韩欧美国产一区二区在线播放| 日本视频免费在线| 国产日韩欧美制服另类| 国内精品国产三级国产aⅴ久| 极品少妇一区二区三区| 日韩久久久久久久| 国产精品久久久久久久久久辛辛 | xxxxx成人.com| aaa级黄色片| 欧美日韩精品在线视频| 激情高潮到大叫狂喷水| 成人性生交大片免费看中文网站| 国产真实乱子伦| 午夜精品一区二区三区国产| 精品欧美一区二区三区久久久| 日本在线中文字幕一区二区三区| 米奇精品一区二区三区在线观看| 视频国产一区二区三区| 在线观看91精品国产麻豆| 四虎成人精品永久免费av| 国产欧美日韩在线视频| 国产精品熟妇一区二区三区四区| 久久综合影视| www.国产在线视频| 欧美呦呦网站| 另类小说综合网| 日本一区影院| 国产精品免费电影| 国产激情在线播放| 久久99精品久久久久久噜噜| 国产h在线观看| 亚洲国产精品久久| 国产日本精品视频| 在线精品视频免费播放| 国产无遮挡裸体免费视频| 亚洲欧洲综合另类在线| 蜜桃av乱码一区二区三区| av一区二区三区在线| 国产精品国产三级欧美二区| 蜜桃视频无码区在线观看| 欧美+日本+国产+在线a∨观看| 日韩免费一区二区三区| 久久亚洲道色| 99r国产精品视频| 全球中文成人在线| 国产精品第二页| 天天综合av| 久久久久久久久网站| 中文字幕中文字幕在线十八区| 中文字幕视频一区二区在线有码| 男人久久精品| 精品视频久久久久久| 天天操天天干天天| 精品国产第一区二区三区观看体验| 99久久精品日本一区二区免费| 欧美三级电影网站| 欧美成人一区二区三区四区| 欧美日韩中文字幕在线视频| 在线观看 中文字幕| 一区二区激情小说| 毛片a片免费观看| 一区二区三区在线视频播放| 伊人在线视频观看| 综合久久综合久久| 麻豆精品国产免费| 综合久久久久综合| 中文字幕在线观看2018| 亚洲天堂中文字幕| 男女全黄做爰文章| 综合中文字幕亚洲| 欧美激情一区二区视频| 亚洲制服丝袜av| 五月天婷婷网站| 欧美日韩国产综合新一区| 国产91精品一区| 日韩欧美国产中文字幕| 国产免费a视频| 欧美在线观看一二区| 在线观看中文字幕2021| 欧美精品在欧美一区二区少妇| 亚洲图片欧美在线| 在线电影一区二区三区| 国产黄色一区二区| 欧美成人vr18sexvr| 人人妻人人澡人人爽久久av| 亚洲精品久久久久久久久久久| 青青操视频在线| 在线观看国产精品日韩av| 欧美边添边摸边做边爱免费| 久久99久久99精品中文字幕| а√在线中文网新版地址在线| 日韩av手机在线看| 欧美91在线|欧美| 97人人干人人| 亚洲图片久久| 亚洲一区二区三区精品视频| 欧美精品麻豆| www黄色av| 裸体一区二区三区| 国产成人av免费观看| 91麻豆免费看片| 制服丨自拍丨欧美丨动漫丨| 亚洲 欧美综合在线网络| 无码一区二区三区| 91精品国产色综合久久不卡电影| 国产自产一区二区| 中文字幕亚洲欧美日韩在线不卡 | 国自在线精品视频| 久久亚洲精品爱爱| 91免费版黄色| 国产剧情在线观看一区| 日韩video| 视频一区二区三区中文字幕| 精品人妻一区二区乱码| 久久久久成人黄色影片| 国产乱国产乱老熟300| 色婷婷一区二区| 精品国产乱码久久久久久蜜臀网站| 精品视频中文字幕| 亚洲综合伊人久久大杳蕉| 国产91色在线免费| 亚洲一区二区三区免费| 日韩高清在线播放| 精品91视频| 911福利视频| 久久久亚洲综合| 国产一级黄色av| 欧美日韩不卡在线| 黄色在线网站| 国内精品久久久久伊人av| 国产电影一区| 日韩一本精品| 麻豆九一精品爱看视频在线观看免费| 男人的天堂免费| 中文字幕在线不卡国产视频| 男人天堂2024| 亚洲国产日韩欧美在线99| 精产国品自在线www| 国产精品男人爽免费视频1| 亚洲日本三级| 欧美精品一区二区三区三州| 国产精品123区| 黄色精品视频在线观看| 91九色02白丝porn| 水莓100在线视频| 久久久亚洲欧洲日产国码aⅴ| 精品国产亚洲一区二区在线观看| 亚洲成人午夜在线| 日韩精品乱码免费| 草草影院第一页| 天天av天天翘天天综合网 | 国产亚洲欧美视频| 涩涩视频在线播放| 国产日韩精品久久| 国产综合色产| 无码av免费精品一区二区三区| 亚洲伦在线观看| 国产人妖一区二区三区| 日韩在线播放视频| 日本午夜精品久久久久| 先锋影音一区二区三区| 久久一二三区| 右手影院亚洲欧美| 欧美午夜无遮挡| 国产在线黄色| 国产精品美女网站| 青青草综合网| 亚洲精品手机在线观看| 国产精品久久久久久久久快鸭 | 日韩经典中文字幕| mm视频在线视频| 精品久久久久久乱码天堂| 国产日韩1区| 熟女俱乐部一区二区| 色视频一区二区| 成年人在线视频| 成人国产精品久久久| 欧美日韩mv| 喷水视频在线观看| 色综合色狠狠天天综合色| 在线免费观看黄色av| 亚洲aⅴ日韩av电影在线观看| 欧美一区影院| 国产成人av无码精品| 日韩欧美亚洲成人| sese在线视频| 2014亚洲精品| 日韩午夜黄色| 国产精品美女高潮无套| 51精品国自产在线| 秋霞在线视频| 乱色588欧美| 美国一区二区三区在线播放 | 国内外激情在线| 国产精品日韩高清| 久久av在线| 潘金莲一级黄色片| 精品欧美久久久| 欧美电影免费观看网站| 永久久久久久| 99久久伊人网影院| 中文字幕 自拍偷拍| 久久久久北条麻妃免费看| 国偷自产视频一区二区久| 精品视频无码一区二区三区| 国产精品成人免费精品自在线观看| 国产成人三级在线播放| 国产91色在线免费| 午夜久久一区| 我不卡一区二区| 欧美一卡二卡在线观看| 中文在线а√在线8| 女女同性女同一区二区三区按摩| 99久久99久久综合| 国产精品国产三级国产aⅴ| 欧美亚洲第一页| 亚洲v在线看| 日本xxxxxxxxx18| 精品嫩草影院久久| 九九久久国产| 久久精品午夜福利|