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

eve.cm

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

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


Просто всегда приходится поступать нерационально) Например, перед запуском проекта называть файл "свободен.txt", а затем при запуске первый успевший поток переименовывает файл в "занят.тхт", и дальше через конструкции IF с этим файлом работает как раз только первый успевший поток. Всё это как-то глупо)
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 885
Баллы
113
Можно записывать в файл данные и брать их от туда. Т.е. первый поток берёт строку с удалением, следующий пробует взять - не получается, идёт по неудачному выходу в другом направлении.
 

eve.cm

Client
Регистрация
16.01.2013
Сообщения
100
Благодарностей
16
Баллы
18
Конечно есть самые разные варианты, но интересно узнать про элегантный метод) так как на этот раз все эти "изощрения" не совсем удобны
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 885
Баллы
113
А чем Вам не подходит то, что я написал? Тут только 1 поток будет работать в нужном направлении.
Можно еще исползовать глобальные переменные, но это будет сложнее. Я дал Вам наиболее простой вариант.
Можно так же использовать код, лочить файл, брать данные, устанавливать глобальную переменную, следующим потоком проверять установлена ли она, если да, то идти в другом направлении. Можете в этом направлении поковыряться, но тут я думаю, что Вам пара дней пригодится.
 
  • Спасибо
Реакции: eve.cm

eve.cm

Client
Регистрация
16.01.2013
Сообщения
100
Благодарностей
16
Баллы
18
Как иногда правильное слово может помочь :-)
Буду использовать глобальную переменную, только немного иначе

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

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

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

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

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

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

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 885
Баллы
113

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