私は 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() が最初に来るものは、それが行き詰まるものです...何かアイデアはありますか?