#include <iostream.h> #include <Windows.h> #include <stdio.h>
bool lock[4] = { false, false, false, false }; int buffer[4] = { 0, 0, 0, 0 }; void display() { ?? ?cout << "--------------------" << endl; ?? ?cout << "缓冲区 ? ? 0 ? ? 1 ? ? 2 ? ? 3" << endl; ?? ?for (int i = 0; i < 4; i++) { cout << " ? ?" << buffer[i] << " ? ?"; } ?? ?cout << endl; } DWORD WINAPI Producer(LPVOID lpParameter) { ?? ?while (true) { ?? ??? ?for (int j = 0; j < 4; j++) { ?? ??? ??? ?if (buffer[j] == 0) { ?? ??? ??? ??? ?if (lock[j] == false) { ?? ??? ??? ??? ??? ?lock[j] = true; ?? ??? ??? ??? ??? ?if (buffer[j] < 1) { ?? ??? ??? ??? ??? ??? ?++buffer[j]; ?? ??? ??? ??? ??? ??? ?cout << "生产一个资源,放入缓冲区" << j << "中" << endl; ?? ??? ??? ??? ??? ??? ?lock[j] = false; ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if (j == 3) { ?? ??? ??? ??? ??? ?cout << "找不到空缓冲区,等待中。。" << endl; ?? ??? ??? ??? ??? ?Sleep(2000); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?return 0; } DWORD WINAPI Customer(LPVOID lpParameter) { ?? ?while (true) { ?? ??? ?for (int n = 0; n < 4; n++) { ?? ??? ??? ?if (buffer[n] == 1) { ?? ??? ??? ??? ?if (lock[n] == false) { ?? ??? ??? ??? ??? ?lock[n] = true; ?? ??? ??? ??? ??? ?if (buffer[n] >= 1) { ?? ??? ??? ??? ??? ??? ?--buffer[n]; ?? ??? ??? ??? ??? ??? ?cout << "消耗一个资源,从缓冲区" << n << "中取出" << endl; ?? ??? ??? ??? ??? ??? ?lock[n] = false; ?? ??? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?if (n == 3) { ?? ??? ??? ??? ?cout << "找不到满缓冲区,等待中。。" << endl; ?? ??? ??? ??? ?Sleep(2000); ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?return 0; }
int main(int argc,char*argv[]) { ?? ?display(); ?? ?HANDLE handle[3]; ?? ?DWORD dw1,dw2,dw3,dw4,dw0; ?? ?handle[0] = Create Thread(NULL, 0, Producer, NULL, 0, &dw1); ?? ?handle[1] = Create Thread(NULL, 0, Producer, NULL, 0, &dw2); ?? ?handle[2] = Create Thread(NULL, 0, Producer, NULL, 0, &dw3); ?? ?handle[3] = Create Thread(NULL, 0, Customer, NULL, 0, &dw4); ?? ?handle[4] = Create Thread(NULL, 0, Customer, NULL, 0, &dw0); ?? ?display(); ?? ?Sleep(3000); ?? ?display(); ?? ?return 0; } ?
|