Сонный металюга
46 / 46 / 13
Регистрация: 10.05.2009
Сообщений: 295
|
||||||
1 | ||||||
Синхронизация процессов при помощи мьютексов13.11.2009, 10:58. Показов 4922. Ответов 24
начал разбираться с мбютексами, а точнее как синхронизировать 2 рпоцесса с их помощью.
по идее, чайлд процес должен залочить мьютекс первым и подождав 20 сек вывести сообщение что он разлочился. потом лочит перент, ждет 10 и выводит что он тоже. результат - не лочит никто. что я неправильно сделал?
1
|
13.11.2009, 10:58 | |
Ответы с готовыми решениями:
24
синхронизация процессов с использованием мьютексов помогите .пожалуйста при помощи ЦИКЛИЧЕСКИХ ПРОЦЕССОВ Синхронизация процессов СИнхронизация процессов |
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
13.11.2009, 22:04 | 2 |
Скомпилировал у себя. Запустил.
Код
this is a child this is a parent lock child - finish lock parent - finish
0
|
Сонный металюга
46 / 46 / 13
Регистрация: 10.05.2009
Сообщений: 295
|
|
13.11.2009, 22:09 [ТС] | 3 |
нет, по идее он же должен так -
ну - чайлд залочил - и пока не разлочил мьютекс - перент не вякает Добавлено через 4 минуты разве нет?
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
13.11.2009, 22:12 | 4 |
Неа. Потому что мьютексы работают на потоках, а ты создаешь процессы - т.е. два разных адресных пространства.
0
|
Сонный металюга
46 / 46 / 13
Регистрация: 10.05.2009
Сообщений: 295
|
||||||
13.11.2009, 22:20 [ТС] | 5 | |||||
т.е. необходимо применять семафоры, так?
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
13.11.2009, 22:23 | 6 |
Ну я не знаю чего ты хочешь. Если синхронизировать _потоки_, так тогда создавай потоки pthread_create. Синхронизировать _процессы_ - можно юзать семафоры.
0
|
Сонный металюга
46 / 46 / 13
Регистрация: 10.05.2009
Сообщений: 295
|
|
13.11.2009, 22:24 [ТС] | 7 |
смотри постом выше=) именно процессы=)
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
||||||
13.11.2009, 22:38 | 8 | |||||
Накидал свой код. Родитель ожидает разрешение на пропуск от семафора. Потомок выполняет свои действия и открывает семафор родителю.
0
|
Сонный металюга
46 / 46 / 13
Регистрация: 10.05.2009
Сообщений: 295
|
||||||
14.11.2009, 00:48 [ТС] | 9 | |||||
ммм.. попробовал твой пример применить для того чтобы разобраться - либо я чгео то не понимаю... но по моему он не лочит=(
вот:
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
14.11.2009, 00:52 | 10 |
Акелла, потому что ты my_semget описал, но вызвать не вызвал.
1
|
Сонный металюга
46 / 46 / 13
Регистрация: 10.05.2009
Сообщений: 295
|
|
14.11.2009, 01:01 [ТС] | 11 |
заработало=) сенкс
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
14.11.2009, 01:05 | 12 |
Непонятно только нафига ты в одном процессе читаешь в буфер, а в другом выводишь его длину.
У каждого процесса свой независимый экземпляр переменной buf. Чтобы оба процесса видели изменение buf, нужно разместить его в разделяемой памяти или использовать прочие радости IPC.
1
|
Сонный металюга
46 / 46 / 13
Регистрация: 10.05.2009
Сообщений: 295
|
|
14.11.2009, 01:09 [ТС] | 13 |
я это уже понял - на самом деле я это делал просто для того чтобы увидеть - лочит или нет - с тем же успехом омно и просто принтф поставить каждый раз.
сейчас потренируюсь с разделяемой памятью заодно Добавлено через 1 минуту точнее с совместно используемой
1
|
0 / 0 / 1
Регистрация: 13.09.2009
Сообщений: 45
|
||||||
02.12.2009, 20:39 | 14 | |||||
Gravity вот к тебе вопрос твой код к примеру работает но если изменить 26-ую строку
условие на if(pid == 0) уже не работает тоесть работает но пишет parent: sem unlocked child: sem locked а ведь не должно у нас же семафор стоит что то не как не пойму и еще один вопрос значение KEY 1147 - произвольное выбирается? и еще semget(KEY, 2, 0666 | IPC_CREAT); - 0666 тоже произвольное?
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
02.12.2009, 21:19 | 15 |
С чего бы не должно? В примере семафор всегда разлочивается вторым процессом.
Произвольное. 0666 - права на идентификатор семафора, rw-rw-rw-.
1
|
0 / 0 / 1
Регистрация: 13.09.2009
Сообщений: 45
|
|
02.12.2009, 21:22 | 16 |
я имею ввиду что все равно сообщение должно выводиться так:
child: sem locked parent: sem unlocked а оно не так выводит ps:может я чего не понимаю я думал что семафор работает не важно с каким процессом, главное чтобы semop() было задано или не так?
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
02.12.2009, 21:29 | 17 |
Ну не знаю, у меня именно так и выводится. Либо у тебя ядро сконфигурировано особо извращенным способом, раз отказывается синхронизировать.
1
|
0 / 0 / 1
Регистрация: 13.09.2009
Сообщений: 45
|
|
02.12.2009, 21:53 | 18 |
Gravity, то есть у тебя выводит
child: sem locked parent: sem unlocked даже если поменять условие на if(pid == 0)? ps:у меня ubuntu 9.04 стоит
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
02.12.2009, 21:54 | 19 |
Sergeymd, ага. И собсно не вижу причин, чтобы смена pid процесса как-то на это влияла (разве что глюки в самой системе).
1
|
0 / 0 / 1
Регистрация: 13.09.2009
Сообщений: 45
|
|
02.12.2009, 22:27 | 20 |
ну и я так вобще думал) я уже 2-ой день втыкаю
оно выводит то нормально, то не правильно Добавлено через 28 минут может быть из-за того что я ubuntu поставил на виртуальную машину?
0
|
02.12.2009, 22:27 | |
02.12.2009, 22:27 | |
Помогаю со студенческими работами здесь
20
Синхронизация процессов Синхронизация процессов Синхронизация процессов Синхронизация процессов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |