[英]How does a compiler knows not to move the code inside a critical section to the outside of the critical section?
[英]How to use critical section
您好,我想編寫一個有2個並發線程的程序。 第一個線程寫入數組字母“ A”,第二個線程寫入“ B”。 我的問題是如何使用臨界區來獲得僅包含字母A和僅包含字母B的交替數組的結果? 這是我的代碼,但無法正常工作。 怎么了
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <psapi.h>
#define SIZE_TAB 200
volatile char program[SIZE_TAB];
CRITICAL_SECTION CriticalSection;
DWORD WINAPI aa(void *v);
DWORD WINAPI bb(void *v);
int main(int argc, char *argv[])
{
InitializeCriticalSection(&CriticalSection);
HANDLE thread_a = CreateThread(NULL, 0, aa, 0, 0, 0);
HANDLE thread_b = CreateThread(NULL, 0, bb, 0, 0, 0);
while (1)
{
for (int i = 0; i<SIZE_TAB; i++)
printf("%c", program[i]);
Sleep(1000);
printf("\n\n");
}
DeleteCriticalSection(&CriticalSection);
CloseHandle(thread_a);
CloseHandle(thread_b);
return 0;
}
DWORD WINAPI aa(void *v)
{
EnterCriticalSection(&CriticalSection);
for (int i = 0; i < SIZE_TAB; i++)
{
program[i] = 'A';
for (int j = 0; j<8000; j++);
}
LeaveCriticalSection(&CriticalSection);
}
DWORD WINAPI bb(void *v)
{
EnterCriticalSection(&CriticalSection);
for (int i = 0; i<SIZE_TAB; i++)
{
program[i] = 'B';
for (int j = 0; j<8000; j++);
}
LeaveCriticalSection(&CriticalSection);
}
關鍵部分是一種保護多線程程序中的數據的方法。 一旦一個線程進入一個關鍵部分,另一個線程就不能進入同一關鍵部分,直到第一個線程離開它為止。
這里有三個線程:主線程aa和bb。 您已經通過使用關鍵部分進行保護來確保線程aa和bb無法同時訪問相同的數據,但是您已將其打開以供主線程隨時訪問(在主循環中,您可以打印出該數據)。數組)。 主線程未在修改它,但是正在訪問它,因此它將打印出當時在數組中找到的所有內容:進入關鍵部分的第一個線程可能已完成修改數據,或者可能沒有完成。 此外,您在aa和bb中都用關鍵部分包圍了整個函數體,這意味着進入它的第一個線程將在另一個線程獲得機會之前完全運行循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.