Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > обмен данными между потоками


Автор: loginrl103 16.2.2009, 13:28
Задача: имеется ряд машин, с работающими программами. Все эти машины должны быть соединены между собой через сервер (роутер). На сервере для каждого соединения с машиной имеется свой поток. Проблема в следующем: потоки должны всё время обмениваться данными (те если клиент А (потокА) хочет отправить данные клиенту Б (потокБ), то потокА должен передать данные для отправки потокуБ), как можно осуществить сиё деяние? Обмен данными будет по всей видимости довольно интенсивный. Хотелось бы реализовать с использованием очередей сообщений, но как вот именно...если реально - желательно обойтись без тяжёловесных библиотек.

ps. linux/pthread/C.

Автор: MAKCim 16.2.2009, 13:55
Цитата(loginrl103 @  16.2.2009,  13:28 Найти цитируемый пост)
но как вот именно

обычный per-thread список, защищенный спин-блокировкой

Автор: loginrl103 16.2.2009, 14:07
можно поконкретнее? код для примера?

Автор: MAKCim 16.2.2009, 14:24
Код

static __thread
{
    struct list_head list;
    atomic_t lock;
} queue = {
    .list = LIST_HEAD_INIT(&queue.list), 
    .lock = UNLOCK(&queue.lock)
};

struct message
{
    struct list_head entry;
// other message fields
};

int add_thread_message(struct message *msg)
{
    LOCK(&queue.lock);
    list_add_tail(&msg->entry, &queue.list);
    UNLOCK(&queue.lock);
}

Автор: GrayCardinal 17.2.2009, 16:48
Рекомендую msgget(2). А еще лучше шаровая память shmget(2) плюс семафор(ы) semget(2). Еще можно простую трубу (pipe(2)) + select. Вариантов, как видите. немеряно. Какой наиболее интересен (объясню подробнее) ? 

Автор: MAKCim 17.2.2009, 17:54
Цитата(GrayCardinal @  17.2.2009,  16:48 Найти цитируемый пост)
Рекомендую msgget(2). А еще лучше шаровая память shmget(2) плюс семафор(ы) semget(2). Еще можно простую трубу (pipe(2)) + select.

зачем?
это жутко не эффективно ;)

Автор: GrayCardinal 17.2.2009, 17:59
MAKCim
Не скажи...  smile 

Автор: MAKCim 17.2.2009, 18:16
Цитата(GrayCardinal @  17.2.2009,  17:59 Найти цитируемый пост)
Не скажи... 

более того, я не просто говорю, я утверждаю  smile 
жду аргументов  smile 

Автор: GrayCardinal 17.2.2009, 18:21
MAKCim
ты утверждаешь, с тебя и тесты smile 
У нас просто понятия скорости разные - вот писать на питоне, вот это действительно МЕДЛЕННО.

Автор: MAKCim 17.2.2009, 18:28
Цитата(GrayCardinal @  17.2.2009,  18:21 Найти цитируемый пост)
У нас просто понятия скорости разные

я к тому, зачем использовать ядро как буфер IPC для _потоков_?  smile 
знаешь сколько в ядре будет выполняться ненужных действий? (применительно к этой задаче)

Добавлено через 2 минуты и 44 секунды
Цитата(GrayCardinal @  17.2.2009,  18:21 Найти цитируемый пост)
вот писать на питоне, вот это действительно МЕДЛЕННО

один фиг как API вызывается

Автор: GrayCardinal 18.2.2009, 09:51
MAKCim
ОК. Но труба-то тебе чем не угодила ?  smile 

Автор: MAKCim 18.2.2009, 11:45
Цитата(GrayCardinal @  18.2.2009,  09:51 Найти цитируемый пост)
Но труба-то тебе чем не угодила ?

хм
а что, pipe не использует буфер в ядре (как и любой другой ядерный IPC)?  smile 

Автор: GrayCardinal 18.2.2009, 12:26
MAKCim
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)