2015-11-24 2 views
0

Я был повсюду в Интернете, и никто прямо не ответил на этот вопрос. Поэтому у меня есть структура в моем основном процессе, и мне нужно несколько потоков, чтобы изменить ее. Я знаю, что мне нужны мьютексы для защиты данных, но есть ли способ поделиться указателями, не передавая их как arg в pthread_create. Я понимаю, что потоки разделяют один и тот же адрес памяти и там, если я выделяю один, другой должен иметь к нему доступ. Но не передавая указатель, как потоки знают, что определенный указатель уже существует.Изменение структуры с несколькими потоками c программированием

+1

Чтобы разделить структуру без ее передачи, вам нужно сделать ее глобальной. – user3386109

+2

Пожалуйста, объясните, почему вы не хотите передавать его как arg в 'pthread_create'. –

+0

Полезный ответ на этот вопрос потребует гораздо большей информации. Было бы особенно полезно описать тип работы, которую вы хотите выполнить. В противном случае вы получите очень общий ответ. –

ответ

2

Типичный ответ на ваш вопрос заключается в том, что вместо передачи указателя непосредственно на поток при вызове pthread_create вместо этого вы передаете указатель на некоторую структуру более высокого уровня, которая служит в качестве вашей связи с потоком.

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

+0

Итак, я делаю простой многопоточный банковский сервер. Я должен использовать мьютексы для управления потоками. Я считаю, что предлагаемое вами решение выше того, что я должен делать. Я просто хочу знать, могу ли я malloc указатель p я могу ссылаться на него в другом потоке? и если да, то как эти потоки разделяют эту информацию. – kevman

+0

@kevman Фраза «malloc a pointer» не имеет никакого смысла. – immibis

+0

@kevman Два потока обращаются к общей коллекции (например, к очереди ожидания), которая позволяет им общаться друг с другом. Указатель на эту коллекцию можно передать в поток в функции 'pthread_create'. –

Смежные вопросы