2012-06-19 6 views
0

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

Это то, что в моей основной:

#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); 
    } 

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

+3

В основном вы спрашиваете: * У меня есть код, который не работает, можете ли вы угадать, не видя в чем проблема? * Вам нужно предоставить фактический код, если вы хотите, чтобы кто-то мог помочь. –

+0

Из вашего описания комментарий 'Same as pthread_create' - ложь. – jxh

+1

Кроме того, «опрос каждые 2 секунды» подсказывает мне, что вы, вероятно, ошибаетесь. То, что вы, кажется, хотите здесь, - это алгоритм производителя/потребителя. Начните с чтения здесь: http://en.wikipedia.org/wiki/Producer-consumer_problem – chetan

ответ

1

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

+3

'-lpthread' не является компилятором. Его указание на то, что компоновщик должен использовать библиотеку pthread при поиске сигнатур API-функций, связанных с pthread. –

Смежные вопросы