Здравствуйте, Hard_Club, Вы писали:
H_C>Есть два параллельных процесса Boost::thread. Несколько процессов должны вызывать на конкурентной основе периодически процедуру из другого процесса.
H_C>Как организовать этот вызов.
С помощью очереди сообщений на снове boost::mutex/boost::condition_variable.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Hard_Club, Вы писали:
H_C>>Есть два параллельных процесса Boost::thread. Несколько процессов должны вызывать на конкурентной основе периодически процедуру из другого процесса.
H_C>>Как организовать этот вызов.
R>С помощью очереди сообщений на снове boost::mutex/boost::condition_variable.
Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC. А если все же потока, то что это за процедура из другого потока, с каких пор процедуры потокам принадлежать стали ? И какое отношение мютекс имеет к очереди сообщений ? каких сообщений ?
PD>Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC. А если все же потока, то что это за процедура из другого потока, с каких пор процедуры потокам принадлежать стали ? И какое отношение мютекс имеет к очереди сообщений ? каких сообщений ?
Короче есть такая задача:
Необходимо реализовать программу в ввиде одного исполняемого файла под Win32 (console или GUI) с использованием С/С++. Программа должна моделировать взаимодействие серверной части и некоторого множества клиентских частей (n <= 10). Серверная часть предназначена для обработки некоторых абстрактных транзакций, поступающих от множества клиентов. Серверная и клиентские процедуры должны исполняться в отдельных потоках. Система должна быть однонаправленной, т.е. клиенты отправляют данные и не ждут ответа. Данные, поступающие от клиентов должны помещаться в очередь с учетом их приоритета. Серверная часть должна извлекать данные из очереди и помещать в файл записи о них в текстовом формате.
Есть клиентские части, они сделаны с поомощью boost::thread. Как из них вызывать метод из класса, хранящего очередь? Можно пример
Здравствуйте, Hard_Club, Вы писали:
H_C>Есть клиентские части, они сделаны с поомощью boost::thread. Как из них вызывать метод из класса, хранящего очередь? Можно пример
class request
{
// your data
};
class request_queue
{
public:
void enqueue(request* req)
{
bool notify = false;
{
boost::unique_lock<boost::mutex> lock (mtx);
notify = queue.empty();
queue.push_back(req);
}
if (notify)
cv.notify_one();
}
request* dequeue()
{
boost::unique_lock<boost::mutex> lock (mtx);
while (queue.empty())
cv.wait(lock);
request* req = queue.front();
queue.pop_front();
return req;
}
private:
boost::mutex mtx;
boost::condition_variable cv;
std::queue<request*> queue;
};
void server_thread()
{
// enqueue 0 to the queue to stop the server threadwhile (request* req = queue.dequeue())
process(req);
}
void client_thread()
{
while (...)
{
request* req = create_request();
queue.enqueue(req);
}
}
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Hard_Club, Вы писали:
H_C>>Есть клиентские части, они сделаны с поомощью boost::thread. Как из них вызывать метод из класса, хранящего очередь? Можно пример
R>
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC.
Ну почему же буст не нужен? boost.interproces очень даже может пригодиться.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC.
ГВ>Ну почему же буст не нужен? boost.interproces очень даже может пригодиться.
Для запуска процедуры из чужого процесса ? Там же маршаллинг нужен, разве он есть в boost.interproces ? Я что-то тут ничего похожего не вижу.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC.
ГВ>>Ну почему же буст не нужен? boost.interproces очень даже может пригодиться.
PD>Для запуска процедуры из чужого процесса ? Там же маршаллинг нужен, разве он есть в boost.interproces ? Я что-то тут ничего похожего не вижу.
PD>http://www.boost.org/doc/libs/1_42_0/doc/html/interprocess.html
Можно извернуться с теми классами, которые есть в bi, например, создавать объекты-параметры в разделяемой памяти. Но в общем — да, какой-никакой маршаллинг придётся делать. Но это, кстати, тоже с помощью буста можно решить.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!