Общение между паралельными процессами
От: Hard_Club  
Дата: 22.04.10 06:36
Оценка:
Есть два параллельных процесса Boost::thread. Несколько процессов должны вызывать на конкурентной основе периодически процедуру из другого процесса.

Как организовать этот вызов.
Re: Общение между паралельными процессами
От: remark Россия http://www.1024cores.net/
Дата: 22.04.10 06:43
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Есть два параллельных процесса Boost::thread. Несколько процессов должны вызывать на конкурентной основе периодически процедуру из другого процесса.


H_C>Как организовать этот вызов.


С помощью очереди сообщений на снове boost::mutex/boost::condition_variable.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Общение между паралельными процессами
От: Pavel Dvorkin Россия  
Дата: 22.04.10 06:55
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Hard_Club, Вы писали:


H_C>>Есть два параллельных процесса Boost::thread. Несколько процессов должны вызывать на конкурентной основе периодически процедуру из другого процесса.


H_C>>Как организовать этот вызов.


R>С помощью очереди сообщений на снове boost::mutex/boost::condition_variable.


Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC. А если все же потока, то что это за процедура из другого потока, с каких пор процедуры потокам принадлежать стали ? И какое отношение мютекс имеет к очереди сообщений ? каких сообщений ?
With best regards
Pavel Dvorkin
Re[3]: Общение между паралельными процессами
От: Hard_Club  
Дата: 22.04.10 07:17
Оценка:
PD>Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC. А если все же потока, то что это за процедура из другого потока, с каких пор процедуры потокам принадлежать стали ? И какое отношение мютекс имеет к очереди сообщений ? каких сообщений ?

Короче есть такая задача:

Необходимо реализовать программу в ввиде одного исполняемого файла под Win32 (console или GUI) с использованием С/С++. Программа должна моделировать взаимодействие серверной части и некоторого множества клиентских частей (n <= 10). Серверная часть предназначена для обработки некоторых абстрактных транзакций, поступающих от множества клиентов. Серверная и клиентские процедуры должны исполняться в отдельных потоках. Система должна быть однонаправленной, т.е. клиенты отправляют данные и не ждут ответа. Данные, поступающие от клиентов должны помещаться в очередь с учетом их приоритета. Серверная часть должна извлекать данные из очереди и помещать в файл записи о них в текстовом формате.

Есть клиентские части, они сделаны с поомощью boost::thread. Как из них вызывать метод из класса, хранящего очередь? Можно пример
Re[4]: Общение между паралельными процессами
От: remark Россия http://www.1024cores.net/
Дата: 22.04.10 07:50
Оценка: +1
Здравствуйте, 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 thread
  while (request* req = queue.dequeue())
    process(req);
}

void client_thread()
{
  while (...)
  {
    request* req = create_request();
    queue.enqueue(req);
  }
}




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: Общение между паралельными процессами
От: Hard_Club  
Дата: 22.04.10 08:14
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Hard_Club, Вы писали:


H_C>>Есть клиентские части, они сделаны с поомощью boost::thread. Как из них вызывать метод из класса, хранящего очередь? Можно пример


R>
R>class request
R>{
R>  // your data
R>};

R>class request_queue
R>{
R>public:
R>  void enqueue(request* req)
R>  {
R>    bool notify = false;
R>    {
R>      boost::unique_lock<boost::mutex> lock (mtx);
R>      notify = queue.empty();
R>      queue.push_back(req);
R>    }      
R>    if (notify)
R>      cv.notify_one();
R>  }
  
R>  request* dequeue()
R>  {
R>      boost::unique_lock<boost::mutex> lock (mtx);
R>      while (queue.empty())
R>        cv.wait(lock);
R>      request* req = queue.front();
R>      queue.pop_front();
R>      return req;
R>  }
  
R>private:
R>  boost::mutex mtx;
R>  boost::condition_variable cv;
R>  std::queue<request*> queue;
R>};


R>void server_thread()
R>{
R>  // enqueue 0 to the queue to stop the server thread
R>  while (request* req = queue.dequeue())
R>    process(req);
R>}

R>void client_thread()
R>{
R>  while (...)
R>  {
R>    request* req = create_request();
R>    queue.enqueue(req);
R>  }
R>}
R>



R>



Спасибо, а что здесь лучше использовать: unique_lock или scoped_lock?
Re[6]: Общение между паралельными процессами
От: remark Россия http://www.1024cores.net/
Дата: 22.04.10 08:25
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Спасибо, а что здесь лучше использовать: unique_lock или scoped_lock?


scoped_lock


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Общение между паралельными процессами
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 22.04.10 23:21
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC.


Ну почему же буст не нужен? boost.interproces очень даже может пригодиться.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: Общение между паралельными процессами
От: Pavel Dvorkin Россия  
Дата: 23.04.10 03:48
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Что-то я не понял ни вопроса, ни ответа. Параллельных процесса ? Или все же потока ? Если процесса, то здесь не буст нужен, а RPC.


ГВ>Ну почему же буст не нужен? boost.interproces очень даже может пригодиться.


Для запуска процедуры из чужого процесса ? Там же маршаллинг нужен, разве он есть в boost.interproces ? Я что-то тут ничего похожего не вижу.

http://www.boost.org/doc/libs/1_42_0/doc/html/interprocess.html
With best regards
Pavel Dvorkin
Re[5]: Общение между паралельными процессами
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.04.10 04:54
Оценка:
Здравствуйте, 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.: Винодельческие провинции — это есть рулез!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.