J'ai écrit ma propre version de la file d'attente sûre. Cependant, lorsque je lance ce programme, il se bloque/se bloque lui-même. Vous vous demandez pourquoi cela est bloqué pour toujours. J'ai écrit le casier de classe RAII.Pourquoi cette file d'attente sûre, crée un blocage?
class locker
{
public:
locker(pthread_mutex_t& lockee): target(lockee)
{
pthread_mutex_lock(&target);
}
~locker()
{
pthread_mutex_unlock(&target);
}
private:
pthread_mutex_t target;
};
Mon code de thread d'auteur/lecteur est très simple. Le thread d'écriture, ajouté à la file d'attente et au thread de lecture, lit dans la file d'attente.
void * writeintoqueue(void* myqueue)
{
void *t = 0;
concurrentqueue *localqueue = (concurrentqueue *) myqueue;
for (int i = 0; i < 10 ; ++i)
{
localqueue->addtoQueue(i*10);
}
pthread_exit(t);
}
void * readfromqueue(void* myqueue)
{
void *t = 0;
concurrentqueue *localqueue = (concurrentqueue *) myqueue;
int number = 0;
for (int i = 0 ; i < 10 ; ++i)
{
number = localqueue->getFromQueue();
std::cout << "The number from the queue is " << number << std::endl;
}
pthread_exit(t);
}
Je ne suis pas un expert en pthreads, mais je ne pense pas que vous vouliez copier votre 'pthread_mutex_t' par valeur dans' target' dans votre classe 'locker'. Faites 'target' un' pthread_mutex_t & 'ou' pthread_mutex_t * '. – msandiford
@spong Je suis certain que c'est le problème. En faisant une copie, le verrouillage et la signalisation ne traitent plus avec la même structure, ce qui entraînerait la perte de beaucoup d'implémentations pthread. Vous devriez ajouter votre commentaire en guise de réponse. –
Pourquoi réinventer la roue. C'est la mise en œuvre que j'utilise. http://gist.github.com/482342 –