Привет, пишу курсовую на с++, компилятор borland c++ 5
Суть в том что в помещение входят и выходят люди (клиенты), в помещение производят опр. действия, но войти может не более 3 человек.
Далее приведен код.
Проблема заключается в том что если есть выделенная строка
WaitForSingleObject(sem_ob,INFINITE);
то фактически может зайти только один человек (class obj), если ее закоментировать, то ломятся все 5.
Думала, второе число в
CreateSemaphore(NULL,1,1,NULL);
определяет кол-во потоков, меняла его ничего не помогает. Подскажите как сделать чтобы создавалось только 3 потока, остальные либо ожидали, либо не создавались вообще.
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include <conio.h>
int i;
HANDLE sem_ob;
HANDLE client_thread;
//Класс для хранения данных об объекте
class obj {
public:
int id;
char* status;
obj (int i1, char s1[10]): id (i1), status (s1) {};
};
void outData (obj o){
//Вывод данных о тек. времени и объекте
char str[255];
char id[2];
SYSTEMTIME systime;
GetLocalTime(&systime);
//Записываем в str время
sprintf(str, "%d:%d:%02d", systime.wHour, systime.wMinute, systime.wSecond);
//Преобразуем id объекта в строку
sprintf(id, "%d", o.id);
//Собираем все данные для вывода
strcat (str, " ");
strcat (str, id);
strcat(str, ":");
strcat (str,o.status);
strcat (str, "\n");
cout <<str;
};
DWORD WINAPI client_way (LPVOID lpParam)
{
//Действия, выполняемые объектом - пока что только создание и удаление объекта
WaitForSingleObject(sem_ob,INFINITE);
obj o (i,"created");
outData (o);
//i для цикла инкрементируется только после создания объекта
i++;
//Здесь вместо слипа будет множество других операций
Sleep (2000);
o.status = "deleted";
outData(o);
ReleaseSemaphore(sem_ob,1,NULL);
return 0;
};
void main () {
sem_ob = CreateSemaphore(NULL,1,1,NULL);
i = 0;
int a;
while (i<6){
a=i;
//Поток для запуска действий объекта
client_thread = CreateThread(NULL,0,client_way,NULL,0,NULL);
//Ожидаем запуска нити и создания объекта
while (a==i) {Sleep (500);};
};
//Ожидаем пока последняя нить завершит свою работу
WaitForSingleObject(client_thread,INFINITE);
Sleep (5000);
};
21.10.10 20:12: Перенесено модератором из 'C/C++' — Odi$$ey