c - 如何使用临界区

标签 c multithreading winapi 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 中都用临界区包围了整个函数体,这意味着第一个进入它的线程将在另一个线程获得机会之前完全运行完循环。

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

相关文章:

c - 如何自动检查 C 函数库是否符合可重入性?

c - 检查信号量值时是什么阻止了竞争条件?

c - 将 2 个 32 位数字相乘并使用 AVX2 取前 32 位

c - 多边形程序中的点

java - Eclipse 自动补全适用于 Runnable 工作,但不适用于 Thread

c++ - Windows CE下单行EDIT控件按ENTER键时如何关闭提示音?

c# - 如何启动一个进程并重定向 stdin,但不重定向 stdout?

在C中的特定地址构造数组

c - 这个字符串反向递归是如何工作的?

c++ - 使用 ShellExecute 打开不带 ".exe"扩展名的可执行文件