#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ą:

  1. Jak wykorzystac klasę BLOKADA, by współpracowała z wątkami i np. umiemożliwiła wykorzystanie tego samego wątku na raz ?
  2. Jakie największe błędy popełniłem pisząc ten kod?
  3. Czy właściwie charakteryzuje się semafor i co go doróżnia od mutexów ?