2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tabula contentorum
In ambitu multi-filato, cum plures filis eadem notitia simul accessere vel mutare, ultimus effectus est sequela temporis exsecutionis.
Si nulla est synchronisatio mechanismi, condiciones generis occurrent, quae ad improprias notitias vel exceptiones programmatis adducere possunt.
- #include <iostream>
- #include <windows.h>
-
- DWORD g_Num = 0;
-
- DWORD WINAPI WorkThread(LPVOID lp)
- {
- for (size_t i = 0; i < 10000000; i++)
- {
- //g_Num++;
- __asm LOCK INC [g_Num]
- }
- return 0;
- }
-
- int main()
- {
- HANDLE hThread[2] = { 0 };
- hThread[0] = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
- hThread[1] = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
- WaitForMultipleObjects(2, hThread, TRUE, -1);
- std::cout << g_Num << std::endl;
-
- return 0;
- }
- #include <iostream>
- #include <windows.h>
-
- DWORD g_Num = 0;
- CRITICAL_SECTION cs = { 0 };
-
- DWORD WINAPI WorkThread(LPVOID lp)
- {
- for (size_t i = 0; i < 1000000; i++)
- {
- // 进入临界区
- EnterCriticalSection(&cs);
-
- // TODO
- g_Num++;
-
- // 退出临界区
- LeaveCriticalSection(&cs);
- }
- return 0;
- }
-
- int main()
- {
-
- HANDLE hThread[2] = { 0 };
- // 初始临界区
- InitializeCriticalSection(&cs);
-
- hThread[0] = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
- hThread[1] = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
-
- WaitForMultipleObjects(2, hThread, TRUE, -1);
-
- std::cout << g_Num << std::endl;
-
- // 清理临界区
- DeleteCriticalSection(&cs);
-
- return 0;
- }
Mutex (Mutex) adhibetur ne plures fila ab accessu vel diminutione facultatum communium simul sint.
Tantum unum linum simul habere potest mutex. Si unum filum obtinet dominium mutex, alia stamina petens mutex obstruetur donec permissio mutex dimittatur.
Mutex creare - CreateMutex
Request Mutex - WaitForSingleObject
Mutex dimitte - ReleaseMutex
- #include <iostream>
- #include <windows.h>
-
- HANDLE hMutex = 0;
- DWORD g_Num = 0;
-
- DWORD WINAPI WorkThread(LPVOID lp)
- {
- for (size_t i = 0; i < 100000; i++)
- {
- WaitForSingleObject(hMutex, INFINITE);
- g_Num++;
- ReleaseMutex(hMutex);
- }
-
- return 0;
- }
-
- int main()
- {
- hMutex = CreateMutex(NULL, FALSE, NULL);
-
- HANDLE hThread1 = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
- HANDLE hThread2 = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
-
- WaitForSingleObject(hThread1, INFINITE);
- WaitForSingleObject(hThread2, INFINITE);
-
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- CloseHandle(hMutex);
-
- std::cout << g_Num << std::endl;
-
- return 0;
- }
discrimine sectionem
Sequela synchronisatio mechanismi pro facultatibus communibus, sectiones criticae mutuae accessum inter fila eiusdem processus praebent.
Singula fila debebunt sectionem criticam ingredi antequam facultates communes accesserint, et sectionem criticam relinquant postquam accessus ad summam synchronizationem filorum perficiatur.
mutex
Mechanismus sequela synchronisatio ad fila multiplices restringere adhibetur ab accessu facultatum communium simul.
- #include <iostream>
- #include <Windows.h>
-
- int main()
- {
- HANDLE hMutex = CreateMutex(NULL, FALSE, L"0xCC_Mutex");
- if (hMutex == NULL) return 0;
- if (GetLastError() == ERROR_ALREADY_EXISTS)
- {
- MessageBox(NULL, L"禁止多开", L"错误", MB_OKCANCEL);
- return 0;
- }
- std::cout << "Game Start..." << std::endl;
- system("pause");
- CloseHandle(hMutex);
- return 0;
- }
perficientur
Sectiones criticae velociores sunt quam mutices intra fila eiusdem processus.
Officium
Mutexes trans processuum synchronizari possunt, sectiones autem criticae tantum inter fila in eodem processu congruere possunt.
dominium
Mutexes stricte dominii requisita habent et solum sequela cum permissionibus mutexis possunt eam dimittere.
- #include <iostream>
- #include <Windows.h>
-
- CRITICAL_SECTION CriticalSection = { 0 };
-
- DWORD WINAPI WorkThread(LPVOID lp)
- {
- EnterCriticalSection(&CriticalSection);
-
- printf("TID -> %d rn", GetCurrentThreadId());
- Sleep(5000);
-
- LeaveCriticalSection(&CriticalSection);
-
- return 0;
- }
-
- int main()
- {
- InitializeCriticalSection(&CriticalSection);
-
- HANDLE hThread1 = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
- Sleep(1000);
- TerminateThread(hThread1, 1);
-
- HANDLE hThread2 = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
- WaitForSingleObject(hThread2, INFINITE);
-
- DeleteCriticalSection(&CriticalSection);
-
- return 0;
- }
- #include <iostream>
- #include <Windows.h>
-
- HANDLE hMutex = NULL;
-
- DWORD WINAPI WorkThread1(LPVOID lp)
- {
- WaitForSingleObject(hMutex, INFINITE);
- printf("TID -> %d rn", GetCurrentThreadId());
- Sleep(5000);
- TerminateThread(GetCurrentThread(), -1);
-
- //todo
- return 0;
- }
-
- DWORD WINAPI WorkThread2(LPVOID lp)
- {
- printf("Wait For Thread1 Leavern");
- WaitForSingleObject(hMutex, INFINITE);
- printf("TID -> %d rn", GetCurrentThreadId());
- ReleaseMutex(hMutex);
- return 0;
- }
-
-
- int main()
- {
- hMutex = CreateMutex(NULL, FALSE, NULL);
-
- HANDLE hThread1 = CreateThread(NULL, 0, WorkThread1, NULL, 0, NULL);
- Sleep(1000);
-
- HANDLE hThread2 = CreateThread(NULL, 0, WorkThread2, NULL, 0, NULL);
- WaitForSingleObject(hThread2, INFINITE);
-
- CloseHandle(hMutex);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
-
- return 0;
- }
Semaphora est obiectum synchronisation usus ad refrenandum accessum ad facultates per plures fila participandas. Contrarium est quod quantitatem facultatum suppeditarum repraesentat. Cum valor semaphoris maior quam 0 est, indicat facultates praesto esse; cum valor 0 est, indicat nullas esse facultates.
manere : Deminuere conatus semaphori valoris. Si valorem semaphoris maior est quam 0, decrementum illud per 1 et executionem continuabit. Si valorem semaphoris 0 est, stamina praecluduntur donec valorem semaphoris maior quam 0 fiat.
liberatus : valorem semaphoris auge. Si alia stamina inclusa sunt, hoc semaphoro exspectantes, una ex illis excitabitur.
Create semaphore
In Fenestra systemata, utere CreateSemaphore
or *CreateSemaphoreEx
Munus semaphore creat.
Exspecta (exspecta) et emissio (Release) semaphore
Exspectans in semaphore fieri solet uti WaitForSingleObject
or *WaitForMultipleObjects
officium.
Dimittere semaphore usus ReleaseSemaphore
officium.
- #include <iostream>
- #include <Windows.h>
-
- #define MAX_COUNT_SEMAPHORE 3
-
-
- HANDLE g_SemapHore = NULL;
- HANDLE g_hThreadArr[10] = { 0 };
-
- DWORD WINAPI WorkThread(LPVOID lp)
- {
- WaitForSingleObject(g_SemapHore, INFINITE);
-
- for (size_t i = 0; i < 10; i++)
- {
- std::cout << "COUNT -> " << (int)lp << std::endl;
- Sleep(500);
- }
-
- ReleaseSemaphore(g_SemapHore, 1, NULL);
-
- return 0;
- }
-
- int main()
- {
- g_SemapHore = CreateSemaphore(
- NULL, //安全属性
- MAX_COUNT_SEMAPHORE, //初始计数
- MAX_COUNT_SEMAPHORE, //最大计数
- NULL //信号名称
- );
-
- if (g_SemapHore == NULL)
- {
- std::cout << GetLastError() << std::endl;
- return 1;
- }
-
- for (size_t i = 0; i < 10; i++)
- {
- g_hThreadArr[i] = CreateThread(
- NULL,
- 0,
- WorkThread,
- (LPVOID)i,
- 0,
- NULL
- );
- }
-
- WaitForMultipleObjects(10, g_hThreadArr, TRUE, INFINITE);
-
- //closehandle
-
- return 0;
- }
In programmatione Fenestra, eventus synchronismi sunt mechanismum adhibitum ut signa mittant inter plures stamina.Res potest essemanual resetor *automatic reset。
Manual Reset Event: Cum eventum (signatum) manebit in hoc statu donec explicite reset. Id significat multa fila exspectantia eventum posse ante eventum reseti excitari.
Auto Reset Event: Cum eventus filo exspectante acceptus est, ratio automatice eventui civitatis ad non-signatum (non-signatum) reponit. Hoc significat tantum unum filum ad tempus excitari licere.
Create eventu
Utens Fenestra API muneraCreateEvent
An res creata potest
lpEventAttributes
: Indicium securitati attributum, si toNULL
, pignus adhibetur.
bManualReset
: siTRUE
, dein eventus manualis retexere creatur, alioquin eventus latis rete creatum est.
bInitialState
: siTRUE
status initialis est status signum;FALSE
est status non significativus.
lpName
: nomen rei.
Ad rem (statuto rei publicae statum insignem) ususSetEvent
officium
Reset ad res (set res publica ad res publica non-signatum) ususResetEvent
officium
Exspectare eventum expectare rei eventum rei publicae signum fieri.WaitForSingleObject
officium
- #include <iostream>
- #include <Windows.h>
-
- DWORD WINAPI WorkThread(LPVOID lp)
- {
- HANDLE hEvent = *(HANDLE*)lp;
- std::cout << "Thread - " << GetCurrentThreadId() << " Waiting For Event" << std::endl;
- WaitForSingleObject(hEvent, INFINITE);
- std::cout << "Thread - " << GetCurrentThreadId() << " actived" << std::endl;
- return 0;
- }
-
- int main()
- {
- HANDLE hThreads[3] = { 0 };
- HANDLE hEvent = NULL;
-
- hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- if (hEvent == NULL) return 0;
-
- for (size_t i = 0; i < 3; i++)
- {
- hThreads[i] = CreateThread(NULL, 0, WorkThread, &hEvent, 0, NULL);
- }
-
- Sleep(2000);
- SetEvent(hEvent);
-
- WaitForMultipleObjects(3, hThreads, TRUE, INFINITE);
-
- CloseHandle(hEvent);
-
- return 0;
- }