У меня есть два 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() на первом месте - это тот, который застрял в ... любых идеях?
В основном вы спрашиваете: * У меня есть код, который не работает, можете ли вы угадать, не видя в чем проблема? * Вам нужно предоставить фактический код, если вы хотите, чтобы кто-то мог помочь. –
Из вашего описания комментарий 'Same as pthread_create' - ложь. – jxh
Кроме того, «опрос каждые 2 секунды» подсказывает мне, что вы, вероятно, ошибаетесь. То, что вы, кажется, хотите здесь, - это алгоритм производителя/потребителя. Начните с чтения здесь: http://en.wikipedia.org/wiki/Producer-consumer_problem – chetan