你好,我想写一个有两个并发线程的程序。第一个线程写入数组字母“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。您已经通过使用关键部分保护线程a a和bb,确保线程aa和bb不能同时访问相同的数据,但是您让它保持打开状态,以便主线程随时访问它(在打印阵列的主循环中)。主线程没有修改它,但它正在访问它,因此它将打印出它当时在数组中找到的任何内容:进入关键部分的第一个线程可能已经完成了对数据的修改,也可能没有。此外,在a a和bb中都用一个关键部分包围了整个函数体,这意味着第一个进入它的线程将在另一个线程获得机会之前完全通过循环。

关于c - 如何使用临界区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49722736/

10-11 08:36