Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 03.12.2012
Сообщений: 11

pthread_mutex_trylock()

21.12.2013, 08:21. Показов 4308. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите, пожалуйста, решить головоломку. Есть задача:
Напишите функцию, удовлетворяющую следующим условиям:
1) Прототип функции: int lab_pthread_mutex_trylock(pthread_mutex_ t *mutex);
2) Входной параметр - адрес мьютекса
3) Возвращаемые значения:
0 , если мьютекс может быть захвачен без блокировки потока,
1 , если попытка захвата мьютекса с помощью функции pthread_mutex_lock() приведет к блокировке вызывающего ее потока
-1 в случае любой ошибки
При реализации функции разрешается использовать стандартные структуры и функции библиотек ОС LINUX за исключением функции pthread_mutex_trylock();

И вторая задача:
Напишите функцию, удовлетворяющую следующим условиям:
1) Прототип функции: int lab_pthread_cond_timedwait(pthread_cond_ t *cond, pthread_mutex_t *mutex, unsigned int timetowait);
2) Входные параметры: адрес условной переменной, адрес мьютекса, количество миллисекунд, устанавливаемое для ожидания условной переменной
3) Возвращаемые значения:
0 в случае успешного выполнения функции;
1 , если время ожидания условной переменной превысило заданное в параметре timetowait количество миллисекунд
-1 в случае любой ошибки.

Я находил на форуме похожую тему годовалой давности, но там парень сам разобрался, не рассказав, как он это сделал...
Я пытался через условие это сделать, но естественно, не получилось.
Примерно это выглядело так:
C
1
2
3
4
if (pthread_mutex_lock(mutex)==0)
return 0;
else 
return 1;
Но загвоздка в том, что в случае else процесс переходит в ожидание и ничего уже не возвращает, пока мьютекс не освободится.
Я читал pthread.h, но не нашел никакой функции, которая бы просто проверяла состояние мьютекса.
Помогите, пожалуйста.
0
1 / 1 / 0
Регистрация: 03.12.2012
Сообщений: 11
24.12.2013, 05:27  [ТС]
Up...?

Добавлено через 1 час 31 минуту
Вот такой код получился.
Но переменная ret почему-то принимает неверные значения. Что я не учел, что сделал не так?
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  1 #include <pthread.h>
  2 #include <stdio.h>
  3 #include <unistd.h>
  4 #include <stdlib.h>
  5 #include <time.h>
  6 #include <string.h>
  7 #include <errno.h>
  8 
  9 pthread_mutex_t my_sync;
 10 pthread_t kidA,kidB;
 11     int anykey;
 12 
 13 int lab_pthread_mutex_trylock(pthread_mutex_t *mutex)
 14 {
 15 int ret;
 16 ret=pthread_mutex_destroy(mutex);
 17 printf("\n\nRET:%d\n\n",ret);
 18 if (ret==0)
 19  {
 20  printf("Mutex is free!");
 21  pthread_mutex_init (mutex, NULL);
 22  return 0;
 23  }
 24 else if (ret==EBUSY)
 25  {
 26  printf("Mutex is busy.");
 27  return 1;
 28  }
 29 else
 30  {
 31  perror("mutex:");
 32  return -1;
 33  }
 34 }
 35 
 36 int lab_pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,     unsigned int timetowait) // это должно стать еще одной функцией
 37 {
 38 
 39 }
 40 
 41 
 42 void * streamA () //Поток А
 43 {
 44     for (;;)
 45     {
 46         sleep(1);
 47         printf("----------\nThread A tries to lock MUTEX...\n");
 48         pthread_mutex_lock (&my_sync);
 49         printf("Thread A locks MUTEX\n");
 50         sleep (1.5);
 51         printf("Thread A keeps locking MUTEX\n");
 52         pthread_mutex_unlock (&my_sync);
 53         printf("Thread A unlocks MUTEX\n*******\n");
 54     }
 55 }
 56 
57 void * streamB () // Поток B
 58 {
 59     for (;;)
 60     {
 61         sleep(3);
 62         printf("Thread B tries to lock MUTEX\n");
 63         anykey=lab_pthread_mutex_trylock (&my_sync);
 64         if (anykey==0)
 65           printf("Thread B can lock MUTEX. Returned:%d\n",anykey);
 66         else if (anykey==1)
 67           printf("Thread B will be locked! Returned:%d\n",anykey);
 68         else if (anykey==-1)
 69           printf("Error! Returned:%d\n",anykey);
 70         printf("Thread B ends.\n");
 71         pthread_mutex_unlock (&my_sync);
 72     }
 73 }
 74 
 75 int main()
 76 {
 77     pthread_attr_t attr;
 78     pthread_mutex_init (&my_sync, NULL);
 79     pthread_attr_init(&attr);
 80     pthread_create (&kidA, &attr, streamA, NULL);
 81     pthread_create (&kidB, &attr, streamB, NULL);
 82     pthread_join(kidA,NULL);
 83     pthread_join(kidB,NULL);
 84 }


Добавлено через 7 минут
Разобрался. 71-я строчка лишняя. Анлок мьютекса без его лока=)

Добавлено через 14 часов 55 минут
Но как быть со второй функцией? Никто не жаждет помочь?=)
1
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
12.01.2014, 13:55
удалось написать вторую функцию?
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
16.01.2014, 18:19
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <errno.h>
 
struct param
{
pthread_cond_t *cond;
int timewait;
};
pthread_mutex_t my_sync;
pthread_t kidA,kidB;
pthread_cond_t rx;
    int anykey=0;
    int retval=22;
    int flag;
    int t;
 
void *func(void *str)
{
struct param *qw=(struct param *)str;
struct param wq=*qw;
sleep (wq.timewait);
flag=1;
pthread_cond_signal(wq.cond);
}
 
 
int lab_pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex, unsigned int timetowait)
{
flag=0;
struct param conds;
pthread_t tid;
conds.timewait=timetowait;
conds.cond=cond;
pthread_create(&tid,NULL,&func,&conds);
pthread_cond_wait(cond,mutex);
if (flag==0)
 {
 return 0;
 }
else if (flag==1)
 {
 return 1;
 }
else
 {
 return -1;
 }
}
 
 
void * streamA () //Поток А
{
srand(time(NULL));
    for (;;)
    {
        sleep(2.5);
    printf("----------\n");
        pthread_mutex_lock (&my_sync);
        printf("Thread A locks MUTEX\n");
    retval=0;
    int sl;
    sl=rand()%3;
        sleep (sl);
    pthread_cond_signal(&rx);
        printf("Thread A keeps locking MUTEX\n");
        pthread_mutex_unlock (&my_sync);
    printf("Thread A unlocks MUTEX\n*******\n");
    }
}
 
void * streamB () // Поток B
{
    for (;;)
    {
    int res;
        sleep(1.5);
        pthread_mutex_lock(&my_sync);
    printf("Thread B locks MUTEX\n");
    while (retval!=0)
//  res=pthread_cond_timedwait(&rx,&my_sync,&timeout);
    res=lab_pthread_cond_timedwait(&rx,&my_sync,t);
    if (res==0)
    printf("Success. Return:%d\n",res);
    else if (res==1)
    printf("ETIMEDOUT. Return:%d\n",res);
    else
    perror("cond_error:\n");
    printf("Thread B ends.\n");
    retval=1;
    pthread_mutex_unlock(&my_sync);
    }
}
 
int main(int argc,char **argv)
{
    t=atoi(argv[1]);
    t=t/1000;
    pthread_attr_t attr;
    pthread_mutex_init (&my_sync, NULL);
    pthread_attr_init(&attr);
    pthread_create (&kidA, &attr, streamA, NULL);
    pthread_create (&kidB, &attr, streamB, NULL);
    pthread_join(kidA,NULL);
    pthread_join(kidB,NULL);
}
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.01.2014, 18:23
танкист34, спасибо. Все равно неправильно)
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
16.01.2014, 18:28
Цитата Сообщение от 0x10 Посмотреть сообщение
танкист34, спасибо. Все равно неправильно)
а что там неверно?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.01.2014, 18:33
танкист34, сам подход.
Если я правильно понимаю специфику конкретного учебного заведения, где дают такие задания, то преподаватель предполагает, что студенты зароются в исходники glibc и будут использовать аналогичные низкоуровневые механизмы для своей реализации. Конкретно под капотом pthread_cond_timedwait лежит системный вызов futex, который как раз умеет ждать изменения значения.

В приведенном же примере создается дополнительный поток со sleep. Порождение лишних потоков по идее вообще неприемлемо. Хотя бы с точки зрения здравого смысла.

И опережая вопрос - как это сделать правильно и чтобы работало. Понятия не имею.
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
16.01.2014, 18:40
Цитата Сообщение от 0x10 Посмотреть сообщение
танкист34, сам подход.
Если я правильно понимаю специфику конкретного учебного заведения, где дают такие задания, то преподаватель предполагает, что студенты зароются в исходники glibc и будут использовать аналогичные низкоуровневые механизмы для своей реализации. Конкретно под капотом pthread_cond_timedwait лежит системный вызов futex, который как раз умеет ждать изменения значения.

В приведенном же примере создается дополнительный поток со sleep. Порождение лишних потоков по идее вообще неприемлемо. Хотя бы с точки зрения здравого смысла.

И опережая вопрос - как это сделать правильно и чтобы работало. Понятия не имею.
да, прикольное задание
0
1 / 1 / 0
Регистрация: 03.12.2012
Сообщений: 11
17.01.2014, 02:05  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
танкист34, сам подход.
Если я правильно понимаю специфику конкретного учебного заведения, где дают такие задания, то преподаватель предполагает, что студенты зароются в исходники glibc и будут использовать аналогичные низкоуровневые механизмы для своей реализации. Конкретно под капотом pthread_cond_timedwait лежит системный вызов futex, который как раз умеет ждать изменения значения.

В приведенном же примере создается дополнительный поток со sleep. Порождение лишних потоков по идее вообще неприемлемо. Хотя бы с точки зрения здравого смысла.

И опережая вопрос - как это сделать правильно и чтобы работало. Понятия не имею.
Не могу знать точно, но мне кажется, что именно в моем случае хватит такого варианта. В задании было указано, что необходимо зарываться в pthread.h. В принципе функция работает и выдает верный результат, а способ реализации лично меня мало волнует
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
17.01.2014, 09:22
не приняли, неправильный код под корень
0
17.01.2014, 10:06

Не по теме:

Цитата Сообщение от танкист34 Посмотреть сообщение
не приняли, неправильный код под корень
Предсказуемо, да.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru