Синхронизация входного потока pthread и рабочего потока

У меня есть два pthreads, один из которых читает из cin и помещает его в QUEUE, а другой — рабочий поток, проверяющий QUEUE каждые 2 секунды и печатающий что-то, если в нем что-то есть.

Это то, что у меня в основном:

#include <string>
#include <queue>
#include <iostream>
#include <stdio.h>
#include "Thread.h"
#include "Mutex.h"

using namespace std;

queue<string> lineup;
Mutex lock;

class InputReader:public Thread{
    private:
        string buffer;
    protected:
        virtual void run(){
            while(true){
                cout << "Please Enter some Text:\n" ;
                getline(cin,buffer);
                lock.lock();
                lineup.push(buffer);
                lock.unlock();
            }
        }
    public:
        InputReader(){}
        ~InputReader(){}
};


class Request: public Thread{
    protected:
        virtual void run(){
            while(true){
                sleep(2);
                lock.lock();
                if ((int)(lineup.size())>0){
                    cout << "Sending Request: " << lineup.front() << endl;
                    lineup.pop();
                }
                else{
                    cout << "Nothing to send!" <<endl;
                }
                lock.unlock();

            }
        }
    public:
        Request(){}
        ~Request(){}
};

int main(){
    Request rq;InputReader iread; 
    iread.start();  rq.start();
    iread.join(); rq.join();

    return 0;
}

Где Thread.h и Thread.cpp:

#ifndef __THREAD_H__
#define __THREAD_H__
#include <pthread.h>

class Thread
{
    private:
        pthread_t thread;
        static void * dispatch(void *);
    protected:
        virtual void run() = 0;
    public:
        virtual ~Thread();
        void start();
        void join();
};

#endif

//  THREAD.CPP
#include "Thread.h"

Thread::~Thread(){}

void * Thread::dispatch(void * ptr)
{
    if (!ptr) return 0;
    static_cast<Thread *>(ptr)->run();
    pthread_exit(ptr);
    return 0;
}

void Thread::start(){
    pthread_create(&thread, 0, Thread::dispatch, this);
}

void Thread::join()
{
    pthread_join(thread, 0);
}

Mutex.h и Mutex.cpp:

#ifndef __MUTEX_H__
#define __MUTEX_H__
#include <pthread.h>

class Mutex
{
private:
    pthread_mutex_t mutex;
public:
    Mutex();
    ~Mutex();
    void lock();
    void unlock();
    bool trylock();
};

#endif

// MUTEX.CPP -----------------------
#include "Mutex.h"
Mutex::Mutex(){
       pthread_mutex_init(&mutex, 0);
   }
   Mutex::~Mutex(){
      pthread_mutex_destroy(&mutex);
  }
  void Mutex::lock(){
      pthread_mutex_lock(&mutex);
  }
  void Mutex::unlock(){
      pthread_mutex_unlock(&mutex);
  }
  bool Mutex::trylock()  {
      return (pthread_mutex_trylock(&mutex) == 0);
  }

Проблема заключается в том, что когда он находится в бесконечном цикле, ожидающем стандартного ввода в потоке iread, поток rq никогда не запускается. На самом деле, какой бы .start() ни появился первым, он застревает... есть идеи?


person mrBorna    schedule 19.06.2012    source источник
comment
По сути, вы спрашиваете: У меня есть какой-то код, который не работает, можете ли вы, не видя его, догадаться, в чем проблема? Если вы хотите, чтобы кто-нибудь мог помочь, вам нужно предоставить фактический код.   -  person David Rodríguez - dribeas    schedule 19.06.2012
comment
Судя по вашему описанию, комментарий Same as pthread_create является ложью.   -  person jxh    schedule 19.06.2012
comment
Кроме того, опрос каждого 2-секундного потока подсказывает мне, что вы, вероятно, делаете это неправильно. Кажется, вам нужен алгоритм производителя/потребителя. Начните с чтения здесь: en.wikipedia.org/wiki/Producer-consumer_problem   -  person chetan    schedule 19.06.2012
comment
Здесь недостаточно информации, чтобы что-то сделать. Голосование за закрытие.   -  person Martin York    schedule 19.06.2012
comment
Я забыл, что разместил это. Я понял, что публиковать все классы было бы слишком много, и подумал, что отменил это :/ Я просто отредактировал детали для будущих исследователей. В любом случае проблема решена. См. решение ниже. Хотя спасибо, что посмотрели   -  person mrBorna    schedule 19.06.2012


Ответы (1)


Оказалось, что мне нужно запустить g++ с параметром -lpthread. Кто-нибудь знает, почему это не включено по умолчанию?

person mrBorna    schedule 19.06.2012
comment
-lpthread не является опцией компилятора. Это указывает на то, что компоновщик должен использовать библиотеку pthread при поиске сигнатур API функций, связанных с pthread. - person Jay D; 19.06.2012