LINUX.ORG.RU

Помогите решить задачу на pthreads


0

1

Здравствуйте!

Помогите пожалуйста решить такую задачу. Создать поток. Родительский и дочерний поток должны распечатать по несколько строк текста, по одной строке по очереди: сначала родительский поток, затем дочерний и так далее. Для синхронизации использовать мьютексы. Можно ли решить задачу, используя только мьютексы?

2 мьютекса, разлочивать по очереди
//эх, первый курс, как давно ты был

zhuravlik ★★★★ ()

Берем Стивенса, нагло воруем у него готовый пример, немного аккомодируя под свои условия.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от zhuravlik

спасибо, сейчас попробовал - получилось. Сделал таким образом

parent:
lock(2)
от 1 до n
{
.....lock(1)
.....print
.....unlock(2)
}

child:
от 1 до n
{
....lock(2)
.....print
.....unlock(1)
}


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

также, в другой задаче предлагается доказать, что приведенная здесь задача не решается с использованием двух мьютексов без использования других средств синхронизации


vladislav99 ()
Ответ на: комментарий от Eddy_Em

и чем мне это поможет?

в своем предыдущем сообщении я говорил о том, что если буду использовать мьютексы типа PTHREAD_MUTEX_ERRORCHECK, один поток не сможет разлочить мьютекс, который заблокирован другим потоком, а именно таким образом и решена задача сейчас.

vladislav99 ()
Ответ на: комментарий от vladislav99

Можно даже с одним если не париться об эффективности

thread 1
for i in 1..10
       while(!myprint (0, str[i]));

thread 2
for i in 1..10
   while(!myprint (1, str[i]));


int myprint (thread_num, str)
{
    static mutex = init_static_mutex;
    static int count = 0;
    int printed = 0;
    lock (mutex);
    if (count % 2 == thread_num) {
        print str;
        count++;
        printed = 1;
    }   
    unlock (mutex);
    return printed;
}

grassmeister ()
Ответ на: комментарий от grassmeister

мне кажется и даже этот один можно убрать и ничего не изменится, или я ошибаюсь?

vladislav99 ()
Ответ на: комментарий от vladislav99

>а по сути вопроса что нибудь можешь ответить, юморист?

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

PS: не стоит грубить.

halturin ★★★★★ ()
Ответ на: комментарий от halturin

я бы не стал писать на форум, не попробовав прежде свои силы. В гугле я искал, и эта книжка у меня уже была. В данном случае меня смутила постановка задачи на конкретном сайте, поэтому я решил спросить здесь. Ваш комментарий я посчитал не только бессмысленным, но и в некоторой степени оскорбительным, поэтому так на него прореагировал.

vladislav99 ()
Ответ на: комментарий от grassmeister

В Вашем примере mutex вообще не нужен, т.к. эффективность Вас не волнует.

Sorcerer ★★★★★ ()
Ответ на: комментарий от Sorcerer

Нужен

The only operation guaranteed by the C language standard to be atomic is assigning or retrieving a value to/from a variable of type sig_atomic_t, defined in <signal.h>.
(C99, chapter 7.14 Signal handling.)

Представьте например что в гипотетической архитекуре операция записи в память должна выполняться два раза:

1. Записать в память
2. Прочитать и сравнить корректность
3. Записать еще раз на всякий случай

После команды 2. у вас выполнится второй поток, который запишет новое значение в переменную counter, и команда 3 благополучно это значение перепишет.


grassmeister ()
Ответ на: комментарий от grassmeister

На практике чтение/запись машинного слова - атомарные операции. Или приведите пример такой Вашей архитектуры, где это не так. Можете также объявить count как (volatile) sig_atomic_t, если настаиваете.

Sorcerer ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.