最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 如何實(shí)現(xiàn)多線程與線程同步

 更新時(shí)間:2021年06月23日 14:57:02   作者:lyshark  
多線程中的線程同步可以使用,CreateThread,CreateMutex 互斥鎖實(shí)現(xiàn)線程同步,通過臨界區(qū)實(shí)現(xiàn)線程同步,Semaphore 基于信號(hào)實(shí)現(xiàn)線程同步,CreateEvent 事件對(duì)象的同步,以及線程函數(shù)傳遞單一參數(shù)與多個(gè)參數(shù)的實(shí)現(xiàn)方式。

CreateThread 實(shí)現(xiàn)多線程:

先來創(chuàng)建一個(gè)簡(jiǎn)單的多線程實(shí)例,無參數(shù)傳遞版,運(yùn)行實(shí)例會(huì)發(fā)現(xiàn),主線程與子線程運(yùn)行無規(guī)律。

#include <windows.h>
#include <iostream>

using namespace std;

DWORD WINAPI Func(LPVOID lpParamter)
{
	for (int x = 0; x < 10; x++)
	{
		cout << "thread function" << endl;
		Sleep(200);
	}
	return 0;
}

int main(int argc,char * argv[])
{
	HANDLE hThread = CreateThread(NULL, 0, Func, NULL, 0, NULL);
	CloseHandle(hThread);

	for (int x = 0; x < 10; x++)
	{
		cout << "main thread" << endl;
		Sleep(400);
	}

	system("pause");
	return 0;
}

beginthreadex 實(shí)現(xiàn)多線程:

這個(gè)方法與前面的CreateThread使用完全一致,只是在參數(shù)上面應(yīng)使用void *該參數(shù)可以強(qiáng)轉(zhuǎn)為任意類型,兩者實(shí)現(xiàn)效果完全一致。

#include <windows.h>
#include <iostream>
#include <process.h>

using namespace std;

unsigned WINAPI Func(void *arg)
{
	for (int x = 0; x < 10; x++)
	{
		cout << "thread function" << endl;
		Sleep(200);
	}
	return 0;
}

int main(int argc, char * argv[])
{
	HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, Func, NULL, 0, NULL);
	CloseHandle(hThread);
	for (int x = 0; x < 10; x++)
	{
		cout << "main thread" << endl;
		Sleep(400);
	}

	system("pause");
	return 0;
}

CreateMutex 互斥鎖實(shí)現(xiàn)線程同步:

使用互斥鎖可以實(shí)現(xiàn)單位時(shí)間內(nèi),只允許一個(gè)線程擁有對(duì)共享資源的獨(dú)占,從而實(shí)現(xiàn)了互不沖突的線程同步。

#include <windows.h>
#include <iostream>

using namespace std;
HANDLE hMutex = NULL;   // 創(chuàng)建互斥鎖

// 線程函數(shù)
DWORD WINAPI Func(LPVOID lpParamter)
{
	for (int x = 0; x < 10; x++)
	{
		// 請(qǐng)求獲得一個(gè)互斥鎖
		WaitForSingleObject(hMutex, INFINITE);
		cout << "thread func" << endl;
		// 釋放互斥鎖
		ReleaseMutex(hMutex);
	}
	return 0;
}

int main(int argc,char * argv[])
{
	HANDLE hThread = CreateThread(NULL, 0, Func, NULL, 0, NULL);

	hMutex = CreateMutex(NULL, FALSE, "lyshark");
	CloseHandle(hThread);

	for (int x = 0; x < 10; x++)
	{
		// 請(qǐng)求獲得一個(gè)互斥鎖
		WaitForSingleObject(hMutex, INFINITE);
		cout << "main thread" << endl;
		
		// 釋放互斥鎖
		ReleaseMutex(hMutex);
	}
	system("pause");
	return 0;
}

通過互斥鎖,同步執(zhí)行兩個(gè)線程函數(shù)。

#include <windows.h>
#include <iostream>

using namespace std;
HANDLE hMutex = NULL;   // 創(chuàng)建互斥鎖
#define NUM_THREAD 50

// 線程函數(shù)1
DWORD WINAPI FuncA(LPVOID lpParamter)
{
	for (int x = 0; x < 10; x++)
	{
		// 請(qǐng)求獲得一個(gè)互斥鎖
		WaitForSingleObject(hMutex, INFINITE);
		cout << "this is thread func A" << endl;
		// 釋放互斥鎖
		ReleaseMutex(hMutex);
	}
	return 0;
}

// 線程函數(shù)2
DWORD WINAPI FuncB(LPVOID lpParamter)
{
	for (int x = 0; x < 10; x++)
	{
		// 請(qǐng)求獲得一個(gè)互斥鎖
		WaitForSingleObject(hMutex, INFINITE);
		cout << "this is thread func B" << endl;
		// 釋放互斥鎖
		ReleaseMutex(hMutex);
	}
	return 0;
}

int main(int argc, char * argv[])
{

	// 用來存儲(chǔ)線程函數(shù)的句柄
	HANDLE tHandle[NUM_THREAD];

	// /創(chuàng)建互斥量,此時(shí)為signaled狀態(tài)
	hMutex = CreateMutex(NULL, FALSE, "lyshark");

	for (int x = 0; x < NUM_THREAD; x++)
	{
		if (x % 2)
		{
			tHandle[x] = CreateThread(NULL, 0, FuncA, NULL, 0, NULL);
		}
		else
		{
			tHandle[x] = CreateThread(NULL, 0, FuncB, NULL, 0, NULL);
		}
	}

	// 等待所有線程函數(shù)執(zhí)行完畢
	WaitForMultipleObjects(NUM_THREAD, tHandle, TRUE, INFINITE);
	
	// 銷毀互斥對(duì)象
	CloseHandle(hMutex);

	system("pause");
	return 0;
}

通過臨界區(qū)實(shí)現(xiàn)線程同步:

臨界區(qū)與互斥鎖差不多,臨界區(qū)使用時(shí)會(huì)創(chuàng)建CRITICAL_SECTION臨界區(qū)對(duì)象,同樣相當(dāng)于一把鑰匙,線程函數(shù)執(zhí)行結(jié)束自動(dòng)上交,如下是臨界區(qū)函數(shù)的定義原型。

//初始化函數(shù)原型
VOID InitializeCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);

//銷毀函數(shù)原型
VOID DeleteCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);

//獲取
VOID EnterCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);

//釋放
VOID LeaveCriticalSection(  
  LPCRITICAL_SECTION lpCriticalSection
);

這一次我們不適用互斥體,使用臨界區(qū)實(shí)現(xiàn)線程同步,結(jié)果與互斥體完全一致,看個(gè)人喜好。

#include <windows.h>
#include <iostream>

using namespace std;
CRITICAL_SECTION cs;         // 全局定義臨界區(qū)對(duì)象
#define NUM_THREAD 50

// 線程函數(shù)
DWORD WINAPI FuncA(LPVOID lpParamter)
{
	for (int x = 0; x < 10; x++)
	{
		//進(jìn)入臨界區(qū)
		EnterCriticalSection(&cs);

		cout << "this is thread func A" << endl;

		//離開臨界區(qū)
		LeaveCriticalSection(&cs);

	}
	return 0;
}

int main(int argc, char * argv[])
{
	// 用來存儲(chǔ)線程函數(shù)的句柄
	HANDLE tHandle[NUM_THREAD];

	//初始化臨界區(qū)
	InitializeCriticalSection(&cs);

	for (int x = 0; x < NUM_THREAD; x++)
	{
		tHandle[x] = CreateThread(NULL, 0, FuncA, NULL, 0, NULL);
	}

	// 等待所有線程函數(shù)執(zhí)行完畢
	WaitForMultipleObjects(NUM_THREAD, tHandle, TRUE, INFINITE);
	
	//釋放臨界區(qū)
	DeleteCriticalSection(&cs);

	system("pause");
	return 0;
}

Semaphore 基于信號(hào)實(shí)現(xiàn)線程同步:

 通過定義一個(gè)信號(hào),初始化信號(hào)為0,利用信號(hào)量值為0時(shí)進(jìn)入non-signaled狀態(tài),大于0時(shí)進(jìn)入signaled狀態(tài)的特性即可實(shí)現(xiàn)線程同步。

#include <windows.h>
#include <iostream>

using namespace std;

static HANDLE SemaphoreOne;
static HANDLE SemaphoreTwo;

// 線程函數(shù)1
DWORD WINAPI FuncA(LPVOID lpParamter)
{
	for (int x = 0; x < 10; x++)
	{
		// 臨界區(qū)開始時(shí)設(shè)置 signaled 狀態(tài)
		WaitForSingleObject(SemaphoreOne, INFINITE);

		cout << "this is thread func A" << endl;

		// 臨界區(qū)結(jié)束則設(shè)置為 non-signaled 狀態(tài)
		ReleaseSemaphore(SemaphoreOne, 1, NULL);
	}
	return 0;
}

// 線程函數(shù)2
DWORD WINAPI FuncB(LPVOID lpParamter)
{
	for (int x = 0; x < 10; x++)
	{
		// 臨界區(qū)開始時(shí)設(shè)置 signaled 狀態(tài)
		WaitForSingleObject(SemaphoreTwo, INFINITE);

		cout << "this is thread func B" << endl;

		// 臨界區(qū)結(jié)束則設(shè)置為 non-signaled 狀態(tài)
		ReleaseSemaphore(SemaphoreTwo, 1, NULL);
	}
	return 0;
}

int main(int argc, char * argv[])
{
	// 用來存儲(chǔ)線程函數(shù)的句柄
	HANDLE hThreadA, hThreadB;

	// 創(chuàng)建信號(hào)量對(duì)象,并且設(shè)置為0進(jìn)入non-signaled狀態(tài) 
	SemaphoreOne = CreateSemaphore(NULL, 0, 1, NULL);

	// 創(chuàng)建信號(hào)量對(duì)象,并且設(shè)置為1進(jìn)入signaled狀態(tài)
	SemaphoreTwo = CreateSemaphore(NULL, 1, 1, NULL);       // 先執(zhí)行這一個(gè)線程函數(shù)

	hThreadA = CreateThread(NULL, 0, FuncA, NULL,0, NULL);
	hThreadB = CreateThread(NULL, 0, FuncB, NULL, 0, NULL);

	// 等待兩個(gè)線程函數(shù)執(zhí)行完畢
	WaitForSingleObject(hThreadA, INFINITE);
	WaitForSingleObject(hThreadA, INFINITE);

	// 銷毀兩個(gè)線程函數(shù)
	CloseHandle(SemaphoreOne);
	CloseHandle(SemaphoreTwo);

	system("pause");
	return 0;
}

上面的一段代碼,容易產(chǎn)生死鎖現(xiàn)象,即,線程函數(shù)B執(zhí)行完成后,A函數(shù)一直處于等待狀態(tài)。

執(zhí)行WaitForSingleObject(semTwo, INFINITE);會(huì)讓線程函數(shù)進(jìn)入類似掛起的狀態(tài),當(dāng)接到ReleaseSemaphore(semOne, 1, NULL);才會(huì)恢復(fù)執(zhí)行。

#include <windows.h>  
#include <stdio.h>  

static HANDLE semOne,semTwo;
static int num;

// 線程函數(shù)A用于接收參書
DWORD WINAPI ReadNumber(LPVOID lpParamter)
{
	int i;
	for (i = 0; i < 5; i++)
	{
		fputs("Input Number: ", stdout);
		//臨界區(qū)的開始 signaled狀態(tài)  
		WaitForSingleObject(semTwo, INFINITE);
		
		scanf("%d", &num);

		//臨界區(qū)的結(jié)束 non-signaled狀態(tài)  
		ReleaseSemaphore(semOne, 1, NULL);
	}
	return 0;
}

// 線程函數(shù)B: 用戶接受參數(shù)后完成計(jì)算
DWORD WINAPI Check(LPVOID lpParamter)
{
	int sum = 0, i;
	for (i = 0; i < 5; i++)
	{
		//臨界區(qū)的開始 non-signaled狀態(tài)  
		WaitForSingleObject(semOne, INFINITE);
		sum += num;
		//臨界區(qū)的結(jié)束 signaled狀態(tài)  
		ReleaseSemaphore(semTwo, 1, NULL);
	}
	printf("The Number IS: %d \n", sum);
	return 0;
}

int main(int argc, char *argv[])
{
	HANDLE hThread1, hThread2;

	//創(chuàng)建信號(hào)量對(duì)象,設(shè)置為0進(jìn)入non-signaled狀態(tài)  
	semOne = CreateSemaphore(NULL, 0, 1, NULL);

	//創(chuàng)建信號(hào)量對(duì)象,設(shè)置為1進(jìn)入signaled狀態(tài)  
	semTwo = CreateSemaphore(NULL, 1, 1, NULL);

	hThread1 = CreateThread(NULL, 0, ReadNumber, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, Check, NULL, 0, NULL);

	// 關(guān)閉臨界區(qū)
	WaitForSingleObject(hThread1, INFINITE);
	WaitForSingleObject(hThread2, INFINITE);

	CloseHandle(semOne);
	CloseHandle(semTwo);

	system("pause");
	return 0;
}

CreateEvent 事件對(duì)象的同步:

事件對(duì)象實(shí)現(xiàn)線程同步,與前面的臨界區(qū)和互斥體有很大的不同,該方法下創(chuàng)建對(duì)象時(shí),可以在自動(dòng)non-signaled狀態(tài)運(yùn)行的auto-reset模式,當(dāng)我們?cè)O(shè)置好我們需要的參數(shù)時(shí),可以直接使用SetEvent(hEvent)設(shè)置事件狀態(tài),會(huì)自動(dòng)執(zhí)行線程函數(shù)。

#include <windows.h>  
#include <stdio.h>  
#include <process.h>  
#define STR_LEN 100  

// 存儲(chǔ)全局字符串
static char str[STR_LEN];

// 設(shè)置事件句柄
static HANDLE hEvent;

// 統(tǒng)計(jì)字符串中是否存在A
unsigned WINAPI NumberOfA(void *arg)
{
	int cnt = 0;
	// 等待線程對(duì)象事件
	WaitForSingleObject(hEvent, INFINITE);
	for (int i = 0; str[i] != 0; i++)
	{
		if (str[i] == 'A')
			cnt++;
	}
	printf("Num of A: %d \n", cnt);
	return 0;
}

// 統(tǒng)計(jì)字符串總長(zhǎng)度
unsigned WINAPI NumberOfOthers(void *arg)
{
	int cnt = 0;
	// 等待線程對(duì)象事件
	WaitForSingleObject(hEvent, INFINITE);
	for (int i = 0; str[i] != 0; i++)
	{
		if (str[i] != 'A')
			cnt++;
	}
	printf("Num of others: %d \n", cnt - 1);
	return 0;
}

int main(int argc, char *argv[])
{
	HANDLE hThread1, hThread2;

	// 以non-signaled創(chuàng)建manual-reset模式的事件對(duì)象
	// 該對(duì)象創(chuàng)建后不會(huì)被立即執(zhí)行,只有我們?cè)O(shè)置狀態(tài)為Signaled時(shí)才會(huì)繼續(xù)
	hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	hThread1 = (HANDLE)_beginthreadex(NULL, 0, NumberOfA, NULL, 0, NULL);
	hThread2 = (HANDLE)_beginthreadex(NULL, 0, NumberOfOthers, NULL, 0, NULL);

	fputs("Input string: ", stdout);
	fgets(str, STR_LEN, stdin);

	// 字符串讀入完畢后,將事件句柄改為signaled狀態(tài)  
	SetEvent(hEvent);

	WaitForSingleObject(hThread1, INFINITE);
	WaitForSingleObject(hThread2, INFINITE);

	//non-signaled 如果不更改,對(duì)象繼續(xù)停留在signaled
	ResetEvent(hEvent);

	CloseHandle(hEvent);

	system("pause");
	return 0;
}

線程函數(shù)傳遞單個(gè)參數(shù):

線程函數(shù)中的定義中LPVOID允許傳遞一個(gè)參數(shù),只需要在縣城函數(shù)中接收并強(qiáng)轉(zhuǎn)(int)(LPVOID)port即可。

#include <stdio.h>
#include <Windows.h>

// 線程函數(shù)接收一個(gè)參數(shù)
DWORD WINAPI ScanThread(LPVOID port)
{
	// 將參數(shù)強(qiáng)制轉(zhuǎn)化為需要的類型
	int Port = (int)(LPVOID)port;
	printf("[+] 端口: %5d \n", port);
	return 1;
}

int main(int argc, char* argv[])
{
	HANDLE handle;

	for (int port = 0; port < 100; port++)
	{
		handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ScanThread, (LPVOID)port, 0, 0);
	}
	WaitForSingleObject(handle, INFINITE);

	system("pause");
	return 0;
}

線程函數(shù)傳遞多參數(shù):

如果想在線程函數(shù)中傳遞多個(gè)參數(shù),則需要傳遞一個(gè)結(jié)構(gòu)指針,通過線程函數(shù)內(nèi)部強(qiáng)轉(zhuǎn)為結(jié)構(gòu)類型后,取值,這個(gè)案例花費(fèi)了我一些時(shí)間,網(wǎng)上也沒找到合適的解決方法,或找到的都是歪瓜裂棗瞎轉(zhuǎn)的東西,最后還是自己研究了一下寫了一個(gè)沒為題的。

其主要是線程函數(shù)中調(diào)用的參數(shù)會(huì)與下一個(gè)線程函數(shù)結(jié)構(gòu)相沖突,解決的辦法時(shí)在每次進(jìn)入線程函數(shù)時(shí),自己拷貝一份,每個(gè)人使用自己的那一份,才可以避免此類事件的發(fā)生,同時(shí)最好配合線程同步一起使用,如下時(shí)線程掃描器的部分代碼片段。

#include <stdio.h>
#include <windows.h>

typedef struct _THREAD_PARAM
{
	char *HostAddr;             // 掃描主機(jī)
	DWORD dwStartPort;          // 端口號(hào)
}THREAD_PARAM;


// 這個(gè)掃描線程函數(shù)
DWORD WINAPI ScanThread(LPVOID lpParam)
{
	// 拷貝傳遞來的掃描參數(shù)
	THREAD_PARAM ScanParam = { 0 };

	// 這一步很重要,如不拷貝,則會(huì)發(fā)生重復(fù)賦值現(xiàn)象,導(dǎo)致掃描端口一直都是一個(gè)。
	// 坑死人的玩意,一開始我始終沒有發(fā)現(xiàn)這個(gè)問題。sb玩意??!
	MoveMemory(&ScanParam, lpParam, sizeof(THREAD_PARAM));

	printf("地址: %-16s --> 端口: %-5d 狀態(tài): [Open] \n", ScanParam.HostAddr, ScanParam.dwStartPort);
	return 0;
}

int main(int argc, char *argv[])
{
	THREAD_PARAM ThreadParam = { 0 };
	ThreadParam.HostAddr = "192.168.1.10";

	for (DWORD port = 1; port < 100; port++)
	{
		ThreadParam.dwStartPort = port;
		HANDLE hThread = CreateThread(NULL, 0, ScanThread, (LPVOID)&ThreadParam, 0, NULL);
		WaitForSingleObject(hThread, INFINITE);
	}

	system("pause");
	return 0;
}

文章出處:https://www.cnblogs.com/lyshark

以上就是C++ 如何實(shí)現(xiàn)多線程與線程同步的詳細(xì)內(nèi)容,更多關(guān)于C++ 實(shí)現(xiàn)多線程與線程同步的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C語言中動(dòng)態(tài)內(nèi)存管理

    詳解C語言中動(dòng)態(tài)內(nèi)存管理

    這篇文章主要為大家詳細(xì)介紹了C語言中動(dòng)態(tài)內(nèi)存管理的相關(guān)知識(shí),以及常見的動(dòng)態(tài)內(nèi)存的錯(cuò)誤,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • Linux系統(tǒng)下C語言中的標(biāo)準(zhǔn)IO總結(jié)

    Linux系統(tǒng)下C語言中的標(biāo)準(zhǔn)IO總結(jié)

    最近用到了C語言的標(biāo)準(zhǔn)IO庫,由于對(duì)其中的一些細(xì)節(jié)不是非常清楚,導(dǎo)致了許多Bug,花了好長(zhǎng)時(shí)間來調(diào)試,所以在此做個(gè)筆記,這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)下C語言中標(biāo)準(zhǔn)IO的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • C++讀取WAV音頻文件的頭部數(shù)據(jù)的實(shí)現(xiàn)方法

    C++讀取WAV音頻文件的頭部數(shù)據(jù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++讀取WAV音頻文件的頭部數(shù)據(jù)的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的方法,需要的朋友可以參考下
    2017-10-10
  • C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序圖文示例

    C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序圖文示例

    這篇文章主要為大家介紹了C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)堆排序的圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C語言解決字符串中插入和刪除某段字符串問題

    C語言解決字符串中插入和刪除某段字符串問題

    這篇文章主要介紹了C語言解決字符串中插入和刪除某段字符串問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • sizeof()的簡(jiǎn)單介紹

    sizeof()的簡(jiǎn)單介紹

    sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲(chǔ)大小
    2013-04-04
  • 一起來學(xué)習(xí)C語言的字符串轉(zhuǎn)換函數(shù)

    一起來學(xué)習(xí)C語言的字符串轉(zhuǎn)換函數(shù)

    這篇文章主要為大家詳細(xì)介紹了C語言的字符串轉(zhuǎn)換函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++連接mysql數(shù)據(jù)庫(改進(jìn)版)

    C++連接mysql數(shù)據(jù)庫(改進(jìn)版)

    C++是大家都非常熟悉的,也是大家平時(shí)辦公中經(jīng)常會(huì)用到的,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • C語言實(shí)現(xiàn)斐波那契數(shù)列(非遞歸)的實(shí)例講解

    C語言實(shí)現(xiàn)斐波那契數(shù)列(非遞歸)的實(shí)例講解

    下面小編就為大家?guī)硪黄狢語言實(shí)現(xiàn)斐波那契數(shù)列(非遞歸)的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 用C語言求解第N項(xiàng)斐波那契數(shù)列問題

    用C語言求解第N項(xiàng)斐波那契數(shù)列問題

    這篇文章主要介紹了用C語言求解第N項(xiàng)斐波那契數(shù)列問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論

溆浦县| 陆良县| 荆门市| 抚松县| 津南区| 威远县| 罗平县| 宝坻区| 汽车| 海安县| 绥宁县| 阜新| 阳东县| 临安市| 芮城县| 太和县| 赤壁市| 肇东市| 金坛市| 鹿泉市| 腾冲县| 浠水县| 漾濞| 阳谷县| 万年县| 定州市| 库伦旗| 宽甸| 临澧县| 荃湾区| 建瓯市| 汉源县| 柞水县| 上饶县| 双辽市| 滕州市| 张北县| 彩票| 松滋市| 报价| 虎林市|