Контроль количества потоков
От: Veroonya  
Дата: 06.10.10 04:23
Оценка:
Привет, пишу курсовую на с++, компилятор 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.