Обработка нескольких операций чтения и одиночной записи

#c #multithreading #pthreads #shared-memory

#c #многопоточность #pthreads #разделяемая память

Вопрос:

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

Например: я читаю из общей памяти, я хочу, чтобы следующий процесс записи дождался завершения чтения. Но после чтения некоторой части запускается процесс записи и изменяет значения.

Я пытался кодировать с использованием мьютекса и cond_wait. Возможно, есть какие-то ошибки, или я действительно не знаю, как работает cond_wait правильно. Нужна помощь

мой фрагмент кода:

 void create_reader()
{
    pthread_mutex_lock(amp;mutex);
    if (0 == fork()) {
        reader();
        exit(0);
    }
    readerID  ;
    r =1;

    pthread_cond_signal(amp;condition);
    pthread_mutex_unlock(amp;mutex);
}

void create_writer()
{
    pthread_mutex_lock(amp;mutex);

    while (!r)
    {
        cout<<"waiting"<<endl;
        pthread_cond_wait(amp;condition,amp;mutex);
    }

    if (0 == fork()) {
        writer();
        exit(0);
    }

    pthread_mutex_unlock(amp;mutex);
    writerID  ;
}
  

Ответ №1:

Поскольку fork() будет создана копия запущенного процесса, если устройство записи изменит память во втором процессе, читатель никогда не увидит изменение памяти в своем собственном:

  • потоки совместно используют память
  • процессы этого не делают (если вы не используете общую память с mmap )

Тем не менее, ваши другие вызовы функций pthread кажутся правильными.

См. http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them

Комментарии:

1. я использовал mmap, но автор не ждет, пока чтение не будет завершено. Вот что я ошибаюсь