SIGSTOP и SIGCONT эквивалент в потоках - PullRequest
4 голосов
/ 16 июня 2011

Есть ли что-то эквивалентное SIGSTOP и SICONT для потоков? Использую pthreads. Спасибо

Редактирование: Я реализую грубую форму синхронизации доступа к файлам между потоками. Так что, если файл уже открыт потоком, и другой поток хочет открыть его снова, мне нужно остановить или приостановить второй поток в тот момент его выполнения. Когда первый поток завершит свою работу, он проверит, какие другие потоки хотели использовать выпущенный файл, и «разбудил» их. Затем второй поток возобновляет выполнение именно с этой точки. Я использую свою собственную структуру хранения данных.

Ответы [ 3 ]

7 голосов
/ 16 июня 2011

Я собираюсь рассказать вам, как делать вещи, вместо того, чтобы отвечать на вопрос. (Посмотрите на «X X проблема».)

Вы пытаетесь запретить двум потокам одновременно обращаться к одному и тому же файлу. Другими словами, доступ взаимно исключителен. «Мьютекс» предназначен для этого. В целом, легче найти помощь, если вы ищете то, что пытаетесь сделать (не допустить одновременного доступа двух потоков к одному и тому же ресурсу), а не ищете, как вы хотите это сделать (один поток ожидает другого).

Редактировать: Звучит так, будто вам действительно нужно много читателей, кроме одного писателя. Это, вероятно, вторая наиболее распространенная проблема синхронизации (после проблемы «производитель-потребитель»). Используйте pthread_rwlock: читатели звонят pthread_rdlock, а писатели звонят pthread_wrlock.

Если вы делаете что-то столь сложное, вам действительно следует начать читать соответствующую литературу. Если вы думаете, что можете заниматься многопоточным программированием, занимаясь серьезным чтением, вы намного умнее меня и вам не нужна моя помощь. Я рекомендую "Маленькую книгу семафоров", которую можно бесплатно скачать ( источник ). Это не про pthreads, но это хороший материал. Проблема читателей-писателей, о которой вы спрашиваете, содержится в п. 4.2 в главе «Классические проблемы синхронизации» (черт, эта проблема даже упоминается в аннотации).

Многопоточное программирование - ЖЕСТКО с заглавными буквами и жирным шрифтом.

1 голос
/ 16 июня 2011

В зависимости от вашего приложения, Pthreads поддерживает то, что можно считать более совершенными механизмами, такими как http://www.unix.com/man-page/all/3t/pthread_suspend/ и механизмы Mutex

1 голос
/ 16 июня 2011

Ну, есть pthread_kill .

Но вы почти наверняка не хотите этого делать. Что если другой поток содержит (например) мьютекс для кучи, и вы пытаетесь вызвать new, пока он остановлен?

Поскольку вы не знаете, что среда выполнения делает с мьютексами, вообще невозможно избежать подобных проблем, если вы полностью не избегаете стандартной библиотеки.

[править]

На самом деле, если подумать, я не уверен, что произойдет, если вы нацеливаетесь на конкретный поток с SIGSTOP, поскольку этот сигнал обычно влияет на весь процесс.

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

...