Поток на каждый сокет может быть не лучшим способом решить эту проблему.Асинхронный подход, управляемый событиями, должен подходить гораздо лучше.Однако, если вы должны сделать это с потоками, и учитывая, что последовательные порты все равно медленные, построение канала между потоком, слушающим последовательный порт, и всеми потоками, обращающимися к сетевым клиентам, является наиболее практичным.С rwlocks вы могли бы делать причудливые вещи для перемещения данных, но вам все равно понадобится способ, чтобы сетевые потоки ожидали как на сокете, так и на данных от последовательного порта, поэтому вам нужно использовать файловые дескрипторы для обоих и что-то вродеpoll.
А если серьезно, это, вероятно, будет намного проще и будет работать лучше без потоков.Думайте об этом как о главном цикле, который ожидает в опросе, который наблюдает за сетью и последовательным портом, определяет, какое событие произошло, и соответственно распределяет данные.Как только у вас появится идея, должно быть все вокруг.