#include <pthread.h>
#include <string>
#include <vector>
#include <list>
#include <iostream>
#include <boost/shared_ptr.hpp>
typedef void* (*fun)(void*);
void* wypisz(void *)
{
std::cout<<"pisze watek -> ";
std::cout<<pthread_self()<<"\n";
pthread_exit(NULL);
}
class THREADS
{
public:
THREADS(unsigned int ile):m_ile(ile)
{
for(unsigned int i = 0 ; i < ile ; ++i)
{
id.push_back(boost::shared_ptr<pthread_t> (new pthread_t));
std::cout<<"Tworze watek: "<<id.back()<<"\n";
}
}
void run(std::vector<fun> FUN)
{
unsigned int x = m_ile;
while(x--)
{
std::cout<<"Biore z puli "<<id.back()<<"\n";
pthread_create(id.back().get(), NULL, FUN.back(), NULL);
FUN.pop_back();
id.push_front(id.back());
id.pop_back();
}
while(x != m_ile)
{
pthread_join(*(id.back().get()), NULL);
x++;
}
}
private:
std::list< boost::shared_ptr<pthread_t> > id;
unsigned int m_ile;
};
/*
class BLOKADA
{
public:
enum Type {DEFAULT, NORMAL, ERRORCHECK, RECURSIVE};
BLOKADA(Type type = DEFAULT)
{
pthread_mutexattr_t attr;
switch(type)
{
case DEFAULT : break;
case NORMAL : pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); break;
case ERRORCHECK : pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); break;
case RECURSIVE : pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); break;
}
pthread_mutex_init(&muteksik, &attr);
pthread_mutexattr_destroy(&attr);
}
~BLOKADA()
{
pthread_mutex_destroy(&muteksik);
}
private:
pthread_mutex_t muteksik;
};*/
int main()
{
THREADS moje_watki(3);
std::vector<fun> FUN;
FUN.push_back(wypisz);
FUN.push_back(wypisz);
FUN.push_back(wypisz);
moje_watki.run(FUN);
return 0;
}
Na początku zaznaczam, że dopiero się uczę dlatego prosze o wyrozumiałość.
Trzy sprawy mnie interesują:
- Jak wykorzystac klasę BLOKADA, by współpracowała z wątkami i np. umiemożliwiła wykorzystanie tego samego wątku na raz ?
- Jakie największe błędy popełniłem pisząc ten kod?
- Czy właściwie charakteryzuje się semafor i co go doróżnia od mutexów ?