0

私は 2 つの pthread を持っています。そのうちの 1 つは cin から読み取って QUEUE に入れ、もう 1 つは 2 秒ごとに QUEUE をチェックし、何かがある場合は何かを出力するワーカー スレッドです。

これは私の主なものです:

#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 スレッドで stdin を待機している無限ループに入ると、rq スレッドが開始されないことです。実際、 .start() が最初に来るものは、それが行き詰まるものです...何かアイデアはありますか?

4

1 に答える 1

1

-lpthreadオプションを指定してg++を実行する必要があることが判明しました。これがデフォルトでオンになっていない理由を誰かが知っていますか?

于 2012-06-19T04:21:56.427 に答える