Mil*_*lek 1 c winapi multithreading 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);
}
Run Code Online (Sandbox Code Playgroud)
临界区是多线程程序中保护数据的一种方法。一旦一个线程进入临界区,另一个线程就无法进入同一临界区,直到第一个线程离开它。
这里有三个线程在运行:主线程、aa 和 bb。您已通过使用临界区保护来确保线程 aa 和 bb 无法同时访问相同的数据,但您将其保持开放状态,以便主线程随时访问它(在打印出以下内容的主循环中)大批)。主线程没有修改它,但它正在访问它,因此它将打印出当时在数组中找到的任何内容:进入临界区的第一个线程可能已经完成对数据的修改,也可能尚未完成。此外,您在 aa 和 bb 中都用临界区包围了整个函数体,这意味着第一个进入临界区的线程将在其他线程获得机会之前完全运行完循环。
| 归档时间: |
|
| 查看次数: |
5872 次 |
| 最近记录: |