Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Вопрос по мьютексам - примитивная задача  (Прочитано 685 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Ashbe

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
  • Дружба хороша при жизни.
    • Просмотр профиля
{Хочу использовать мутекс всего лишь для запрета запуска 2-й копии процесса. Одновременно пробую реализовать то же самое через разделяемую память, там вроде попроще, но тоже не работает так как надо. Но сначала про мутех. Код такой:
static pthread_mutexattr_t mxattr;
static pthread_mutex_t mx;
// = PTHREAD_MUTEX_INITIALIZER;

void UnlockMx()
{
  if (pthread_mutex_unlock(&mx) == -1)
  { perror("Error - pthread_mutex_unlock");
    exit(1);
  };
  puts("Checkflag removed.");
  return;
}

int main(void)
{
  pthread_mutexattr_init(&mxattr);

//  pthread_mutexattr_setpshared(&mxattr, PTHREAD_PROCESS_SHARED);
// если это раскоментарить, результат тот же.

  pthread_mutex_init(&mx, &mxattr);
  int tl;

  atexit(UnlockMx);
 
  printf("%p\n", &mx); // адрес мутекса(?)
  tl = pthread_mutex_trylock(&mx);
  printf("%d\n", tl); // рез-т trylock
  if (tl != 0)
  { if (tl == EBUSY)
      puts("Program is already running!");
    else
      perror("Error - pthread_mutex_trylock()");
    exit(1);
  };
 
  puts("Running...");
  while (1)
  {};
 
  puts("Exiting...");
  UnlockMx;
  return 0;
В результате при запуске проги в двух экземплярах терминала выдаётся один и тот же адрес (мутеха?) и в обоих случаях 0 как результат trylock(). В чём я глобально не прав? В линуксе я ещё не очень спец)

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Re: Вопрос по мьютексам - примитивная задача
« Ответ #1 : 30 Декабря 2015, 10:37:34 »
Если я правильно понимаю, то каждый процесс создает свой экземпляр мьютекса и с ним работает. Чтобы мьютекс был один на оба процесса, тебе надо его класть в разделяемую память и использовать именно его. Покажи, как ты это пробовал делать.

P.S. не забывай  pthread_mutexattr_destroy и pthread_mutex_destroy

Оффлайн Ashbe

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
  • Дружба хороша при жизни.
    • Просмотр профиля
Re: Вопрос по мьютексам - примитивная задача
« Ответ #2 : 30 Декабря 2015, 17:04:13 »
Да, по-видимому с мьютексами оно так и будет работать, то есть не так как надо мне. А в случае разделяемой памяти, так там и мьютекс не нужен. Объясню пока на пальцах, код причёсывать долго)
Создаю именованную область памяти, с флагами O_CREAT|O_EXCL, получаю дескриптор. Второй экземпляр процесса пытается сделать то же самое, получает EBUSY ошибку, пишет что прога из олреди раннинг и завершается. Это всё работает, но надо докрутить до конца. Оставшийся экземпляр процесса у меня в бесконечном цикле (это типа сервер примитивный ваяю), на прерывание по контрол-це вешаю обработчик, который должен разделяемую область за собой убрать (shm_unlink()). Сейчас вот похоже я пришёл к осознанию того, что shm_unlink() не хочет ничего делать, пока не закрыт дескриптор разделяемой области (что в общем логично).
Ну, в общем, твоё сообщение я увидел в самый разгар борьбы с этим) Теперь наверно докручу без мутексов.
Спасибо!

shura1

  • Гость
Re: Вопрос по мьютексам - примитивная задача
« Ответ #3 : 30 Декабря 2015, 18:48:00 »
А может создавать обыкновенный файл lock - а-ля apt? Церемония создания (чтоб процессы друг с другом не пихались) описана в куче мест.

 

Страница сгенерирована за 0.107 секунд. Запросов: 25.