您好我想编写一个包含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);
}
答案 0 :(得分:3)
关键部分是一种保护多线程程序中数据的方法。一旦一个线程进入临界区,另一个线程就不能进入同一个临界区,直到第一个线程离开它。
这里有三个主题:主线程aa和bb。你已经确保线程aa和bb不能同时通过一个关键部分保护它来访问相同的数据,但你打开它让主线程随时访问它(在你打印出来的主循环中)数组)。主线程没有修改它,但它正在访问它,因此它将打印出当时在数组中找到的任何内容:进入临界区的第一个线程可能已经完成修改数据,或者它可能没有。此外,你已经用aa和bb中的一个临界区包围了整个函数体,这意味着输入它的第一个线程将在另一个线程获得机会之前完全运行循环。