Я столкнулся с проблемой многопоточности. Модель многопоточности - 1 производитель - N потребитель.
Производитель создает данные (символьные данные размером около 200 байт каждый), помещает их в кеш фиксированного размера (например, 2Mil). Данные не относятся ко всем потокам. Он применяет фильтр (настроенный) и определяет, что ни один из потоков не подходит для производимых данных.
Производитель помещает указатель на данные в очередь подходящих потоков (только указатель на данные, чтобы избежать копирования данных). Потоки будут удаляться из очереди и отправлять их по TCP/IP своим клиентам.
Проблема: из-за того, что нескольким потокам передается только указатель на данные, когда кеш заполняется, Produces хочет удалить первый элемент (старый). возможность того, что любой поток все еще ссылается на данные.
Возможный способ: использовать атомарную гранулярность. Когда производитель определяет количество подходящих потоков, он может обновить счетчик и список идентификаторов потоков.
class InUseCounter
{
int m_count;
set<thread_t> m_in_use_threads;
Mutex m_mutex;
Condition m_cond;
public:
// This constructor used by Producer
InUseCounter(int count, set<thread_t> tlist)
{
m_count = count;
m_in_use_threads = tlist;
}
// This function is called by each threads
// When they are done with the data,
// Informing that I no longer use the reference to the data.
void decrement(thread_t tid)
{
Gaurd<Mutex> lock(m_mutex);
--m_count;
m_in_use_threads.erease(tid);
}
int get_count() const { return m_count; }
};
мастер-чаш
map<seqnum, Data>
|
v
pair<CharData, InUseCounter>
Когда производитель удаляет элемент, он проверяет счетчик, больше 0, он отправляет действие, чтобы освободить ссылку на потоки в наборе m_in_use_threads.
Вопрос
- Если в главном кеше есть записи 2Mil, будет равное количество InUseCounter, поэтому переменные Mutex, целесообразно ли иметь переменную mutex 2Mil в одном процессе.
- Наличие большой единой структуры данных для поддержки InUseCounter приведет к увеличению времени блокировки для поиска и уменьшения.
- Что было бы лучшей альтернативой моему подходу к поиску ссылок и у кого есть ссылки с очень меньшим временем блокировки.
Заранее спасибо вам за советы.