你好,我想写一个有 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/