LINUX.ORG.RU
ФорумTalks

И смех, и грех

 


1

3

Посмотрите, к чему приводит вера в авторитет преподавателя: https://toster.ru/q/267058

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

☆☆☆☆☆

У меня такое было. Препод заявил, что «Цифровая подпись удостоверяет ОТПРАВИТЕЛЯ сообщения». Я поправил, что цифровая подпись удостоверяет СОСТАВИТЕЛЯ сообщения. Тот срался со мной минут 20 и потом еще вспоминал до конца обучения.

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

Оба остались при своем мнении. В итоге было выпущено 30 человек у которых был курс «Безопасность» и они возможно имеют мнение препода.... Потом они будут в банках работать.

dmxrand ()

Мьютекс нельзя освобождать из чужого потока. Нельзя ждать, пока он станет 1 или 0. У мьютексов есть только состояния захвачен и не захвачен, это не семафоры.

i-rinat ★★★★★ ()
Ответ на: комментарий от hibou

Дык, хочется ему два — я на двух и нарисовал. Хотя, ясен пень, на одном + глобальный флаг было бы проще.

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

Глобальный флаг придется тоже защитить. Ну или атомарные операции юзать. Условия задачи допускают?

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

Кто тебе такое сказал?

https://ru.wikipedia.org/wiki/Мьютекс, второй абзац:

Мьютекс отличается от семафора тем, что только владеющий им поток может его освободить, т.е. перевести в отмеченное состояние.

i-rinat ★★★★★ ()
Ответ на: комментарий от hibou

Глобальный флаг придется тоже защитить

Он меняется только при заблокированном мьютексе, все ОК.

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

Посмотри мой код и скажи, что он не работает…

Мьютекс — это глобальная переменная. И ему насрать, в какой точке ты его заблокируешь, а в какой разблокируешь!

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

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

У потоков память общая. Чего хочешь друг у друга то и меняй. )) ну на свой страх и риск конечно же.

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

Да? Ну тогда найди определение мьютекса, где сказано, что его можно разблокировать из любого потока.

i-rinat ★★★★★ ()
Ответ на: комментарий от hibou

Ну сначала он спросил уверен, ли я и почему. Потом стал давить на то, что преподаватель он. Я привел схему с МИТМ когда боб шлет алисе письмо, но билл его перехватывает. А потом шлет еще раз. В итоге Боб слал 1 раз, а у Алисы 2 письма (а он мог писать - заплати Биллу, я у него занял).

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

dmxrand ()
Ответ на: комментарий от i-rinat

Читай на вики:

In computer science, mutual exclusion refers to the requirement of ensuring that no two concurrent processes[a] are in their critical section at the same time; it is a basic requirement in concurrency control, to prevent race conditions.

Т.е. мьютекс — это эдакий флаг с гарантированно атомарным доступом. ВСĒ! О потоках ничего не говорится.

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

Какой идиот этот ман писал?

The pthread_mutex_unlock() function shall release the mutex object referenced by mutex. The manner in which a mutex is released is dependent upon the mutex's type attribute. If there are threads blocked on the mutex object referenced by mutex when pthread_mutex_unlock() is called, resulting in the mutex becoming available, the scheduling policy shall determine which thread shall acquire the mutex.

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

И еще раз повторю: мьютекс — это просто глобальный атомарный флаг! Откуда его вызывают — пофиг. В нем не сохраняется идентификатор заблокировавшего его потока (нафига бы?). Кроме того, помимо данного случая можно еще какие-нибудь придумать, где мьютексы надо блокировать в одном потоке, а разблокировать в другом!

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

И еще раз повторю: мьютекс — это просто глобальный атомарный флаг!

Ты намеренно путаешь понятие и реализацию.

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>

pthread_mutex_t lock = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;

void *thread_func(void *param) {
  printf("trying to unlock mutex in another thread\n");
  int ret = pthread_mutex_unlock(&lock);
  printf("ret = %d\n", ret);
  return NULL;
}

int main(void) {
  pthread_t t;

  pthread_mutex_lock(&lock);

  printf("starting thread\n");
  pthread_create(&t, NULL, thread_func, NULL);
  pthread_join(t, NULL);
  printf("joined\n");

  printf("unlocking in main thread\n");
  pthread_mutex_unlock(&lock);
  printf("unlocked\n");
  return 0;
}
$ ./a.out 
starting thread
trying to unlock mutex in another thread
ret = 1
joined
unlocking in main thread
unlocked
$ 
i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 2 )
Ответ на: комментарий от Deleted

Почему бы просто не согласиться с человеком? Ведь это так здоровски.

Что здоровски? Что образование в жопе?

APPLE_OS_XX_OS_XY ()
Ответ на: комментарий от i-rinat

PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP

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

Eddy_Em ☆☆☆☆☆ ()

Здесь вообще «средства синхронизации» не нужны, между нами девочками. Это тест на лояльность, студенту дали знания, он обязан эти знания переварить и вернуть в том же виде, а не пороть отсебятину.

ilovewindows ★★★★★ ()
Последнее исправление: ilovewindows (всего исправлений: 1 )
Ответ на: комментарий от Eddy_Em

Некорректное сравнение. Это больше похоже на проверку стула — не намазан ли он клеем — перед тем, как присесть.

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

Задачи бывают разными. Где-то тебе нужно, чтобы из чужого потока мьютекс не могли разблокировать (правда, я юзкейсов этого придумать не могу), где-то — чтобы могли.

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

Американцы вывезли то, что осталось от немецкой фау2, вместе с ученым. И это стало отправной точкой их космической программы. При том что у них до сих пор не очень-то получается. Двигатели они до сих пор у нас покупают. У нас же Королев начал все с нуля. И вывел таки в космос. До сих пор на его трудах летаем и мы и, по-сути, американцы.

Братья Райт в америке - вот, пожалуй, интересные люди. И то, они были практики. Они там брали за основу данные Лилиенталя и на опыте доказали, что это была туфта. Опытным путем составили свои таблицы. Практически, а не теоретически. НЕ ВЫВЕЛИ закона, но выяснили достаточно частных случаев из него. Что позволило им таки полететь. Прекрасно! Но! Считаю, что наш Жуковский, например, сделал гораздо больше. Он вывел сам закон. Формулу. По которой можно было получить в том числе и данные братьев Райт. И вывел он это не зависимо от них. Так что не надо мне тут про американское великое образование.

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

где-то — чтобы могли.

Если нужно дёргать блокировку из разных потоков или процессов, используют семафоры. Мьютексы — это специализация семафоров для случая, когда нужно защитить ресурс от одновременного доступа (mutual exclusion).

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

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

Это же бред. Mutex - частный случай семафора, счетчик которого имеет максимальное значение 1, чем и достигается то самое «mutual exclusion».

Формально никто мне не может запретить:

t1:
while(true) mutex.unlock();

t2:
while(true) { 
  mutex.lock(); 
    oSomething();
  mutex.unlock();
}
Целесообразность такого кода - вопрос другой.

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

Разблокировать mutex из чужого потока - это верный путь на грабли. Потому что если нет гарантии, что в критической секции находится только один поток, то вся синхронизация коту под хвост и ничем не лучше синхронизации на слипах.

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

если нет гарантии, что в критической секции находится только один поток

То пользуются несколько другими методами.

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

А тебя не смущает, что такие преподы как в ОП именно в пост-СССР?

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

Формально никто мне не может запретить

Конечно. Только это нарушение соглашения. Примерно как использовать UB.

i-rinat ★★★★★ ()
Ответ на: комментарий от hibou

А теперь давай расскажи, зачем Королёв ездил в Германию после войны.

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

И эквивалент на сях.

Disclaimer: в pthreads я никогда особо не сувался. Т.ч. считайте это дебютом, и расскажите мне, где я лопух.

Но ведь работает ведь! :D

#include <stdio.h>
#include <pthread.h>

struct args {
	char *msg;
	pthread_mutex_t *a, *b;
};

void *
worker(void *args)
{
	struct args *a = args;
	int i;

	for (i = 0; i < 10; i++) {
		pthread_mutex_lock(a->a);
		printf("%s %d\n", a->msg, i);
		pthread_mutex_unlock(a->b);
	}

	pthread_exit(NULL);
}

int
main()
{
	pthread_t ta, tb;
	pthread_mutex_t ma, mb;

	pthread_mutex_init(&ma, NULL);
	pthread_mutex_init(&mb, NULL);
	pthread_mutex_lock(&mb);

	struct args a = {"Worker A", &ma, &mb};
	struct args b = {"Worker B", &mb, &ma};

	pthread_create(&ta, NULL, worker, &a);
	pthread_create(&tb, NULL, worker, &b);

	pthread_join(ta, NULL);
	pthread_join(tb, NULL);

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