Как можно при многопоточном режиме разрешить доступ к определенному файлу только лишь 1му потоку?

  • Автор темы Автор темы eve.cm
  • Дата начала Дата начала

eve.cm

Client
Регистрация
16.01.2013
Сообщения
100
Реакции
16
Баллы
18
Здравствуйте,

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


Просто всегда приходится поступать нерационально) Например, перед запуском проекта называть файл "свободен.txt", а затем при запуске первый успевший поток переименовывает файл в "занят.тхт", и дальше через конструкции IF с этим файлом работает как раз только первый успевший поток. Всё это как-то глупо)
 
Можно записывать в файл данные и брать их от туда. Т.е. первый поток берёт строку с удалением, следующий пробует взять - не получается, идёт по неудачному выходу в другом направлении.
 
Конечно есть самые разные варианты, но интересно узнать про элегантный метод) так как на этот раз все эти "изощрения" не совсем удобны
 
А чем Вам не подходит то, что я написал? Тут только 1 поток будет работать в нужном направлении.
Можно еще исползовать глобальные переменные, но это будет сложнее. Я дал Вам наиболее простой вариант.
Можно так же использовать код, лочить файл, брать данные, устанавливать глобальную переменную, следующим потоком проверять установлена ли она, если да, то идти в другом направлении. Можете в этом направлении поковыряться, но тут я думаю, что Вам пара дней пригодится.
 
  • Спасибо
Реакции: eve.cm
Как иногда правильное слово может помочь :-)
Буду использовать глобальную переменную, только немного иначе

Пускай имею одну глобальную переменную {global_thread_starts_unixtime}
В самом начале проекта создаю небольшую "бухту", где каждый из N потоков просто стартует и единожды пишет (перезаписывает поверх) в переменную global_thread_starts_unixtime свое уникальное время старта в формате unixtime, а потом просто ждет, пока эту операцию сделает самый последний поток (отследить момент будет несложно).

Кроме того каждый из потоков параллельно сохраняет свое уникальное unixtime время старта в простую локальную переменную unixtime_key (это будут так называемые личные именные "ключи" этих потоков).

Затем перед нужным файлом ставлю условие, что к нему может иметь доступ лишь тот поток, который последним оставил отметину в global_thread_starts_unixtime. Иными словами локальная переменная потока [unixtime_key] == [global_thread_starts_unixtime]

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

Долго конечно объяснять почему не подходят методы со списками в моем конкретном случае, но теперь в моем арсенале появился удобный метод :-)

Большое спасибо вам за наводку!
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)