У меня есть основной поток, который поддерживает массив указателей на некоторые данные. В какой-то момент он генерирует новый поток и передает ему один из указателей. После этого момента он не использует этот указатель. Нить выполняет свою работу (возможно, изменяет заостренные данные) и использует канал, чтобы сообщить основному потоку, что он может снова использовать этот указатель.Использование одновременной памяти из нескольких потоков и кэширования
Основной поток:
struct connection *connections[4];
// initialize connections
while (1)
{
// ...
if (...)
{
pipe(p);
connection->control = p[1];
pthread_create(&thread_id, 0, &handler, connections[i]);
pthread_detach(thread_id);
// ...
}
// ...
if (pipe_data_available[i])
{
// do something with connections[i]
}
// ...
}
другой поток:
void *handler(void *arg)
{
struct connection *connection = arg;
// do something with connection
write(connection->control, data, data_size);
return 0;
}
два потока доступ к той же памяти, но никогда в то же время (основной поток не трогайте указатель, когда породил поток использует его).
У меня есть опасения, что основной поток не может видеть модификации соединений [I] сделано обработчиком (из-за кэша). Может ли это случиться, и если да, то каков наилучший способ убедиться, что основной поток видит изменения?
Этот вид межпоточных комм (т. Е. Проходящий вокруг указателей из некоторого пула) довольно распространен и абсолютно прекрасен, по крайней мере, на оборудовании Intel. Чаще всего это делается с помощью цикла в потоке и блокировки очередей для фактических сообщений, а также для хранения пустых указателей, но то, что вы делаете, кажется мне хорошо (даже если это предотвращает непрерывное создание потоков). –