LINUX.ORG.RU

Mutex и c++


0

2

Имеем 1очередь работ, 5 нитей запускаемых вот с таким кодом

pthread_mutex_t mutexsum;
	pthread_mutex_init(&mutexsum, NULL);
	while (!jobsQueue.empty()) {
		pthread_mutex_lock(&mutexsum);
		first = jobsQueue.front();
		jobsQueue.pop();
		second = jobsQueue.front();
		jobsQueue.pop();
		pthread_mutex_unlock(&mutexsum);
		
		colors1 = renderPixelParallell(first);
		colors2 = renderPixelParallell(second);
		
		pthread_mutex_lock(&mutexsum);
		imageData[first[2]*3] = colors1.x;
		imageData[first[2]*3+1] = colors1.y;
		imageData[first[2]*3+2] = colors1.z;
		imageData[second[2]*3] = colors1.x;
		imageData[second[2]*3+1] = colors1.y;
		imageData[second[2]*3+2] = colors1.z;
		pthread_mutex_unlock(&mutexsum);
	}
	pthread_mutex_destroy(&mutexsum);
	pthread_exit(NULL);
Кто-то залазит туда куда не положено, у меня такое стойкое чувство, что тут с мютексами что-то не то. И еще вопрос, можно ли в ните запускать функцию, которая получает входные параметры а не (void *)?

Deleted

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

ну так я её же блокирую вроде первым мутексом,

Deleted
()

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

AptGet ★★★
()

По приведенному фрагменту над тобой можно только поиздеваться; man pthread_cond_init, особое внимание первому абзацу DESCRIPTION.

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

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

да издевайтесь и трольте, мне не страшно, ман читал, и это читал https://computing.llnl.gov/tutorials/pthreads/ но это все на английском, а мой английкий оставляет желать лучшего. Если есть что почитать что на русском, поделитесь, а то я ничего не нашел толком.

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

В этом виновато отсутсвие сна, спс за исправление

Это AptGet'у спасибо.

http://www.regatta.cs.msu.su/doc/usr/share/man/info/ru_RU/a_doc_lib/aixprggd/gen... сижу читаю

Для общего развития подойдет, но к вопросу на руках нерелевантно. Да и вообще IBM'овская документация для обучения мало полезна. Почитай лучше какой-нибудь учебник (в одном из Стивенсов это должно быть).

А правильнее будет улучшать скиллы английского (и здравого смысла), вот старое, но вполне релевантное введение: https://computing.llnl.gov/tutorials/pthreads/

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

Туторила читал

Да ну, правда?

«Without condition variables, the programmer would need to have threads continually polling (possibly in a critical section), to check if the condition is met. This can be very resource consuming since the thread would be continuously busy in this activity. A condition variable is a way to achieve the same goal without polling».

что за стивенс вот нашел тут Книга по системному программированию. (комментарий) это оно?

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

tailgunner ★★★★★
()

C++

pthread_mutex_lock

Не по-пацански это. Открой для себя boost::thread::scoped_lock.

Кстати, анализ кода с помощью libastral подсказывает, что мьютекс твой нигде не используется и все эти lock/unlock — чистой воды логические NOP'ы.

red_eyed_peguin
()

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

s0L
()

крестушки снова обосрамшись на мутабельности, бггг

anonymous
()
while (!jobsQueue.empty()) {
		pthread_mutex_lock(&mutexsum);
		first = jobsQueue.front();

jobsQueue -> { job0 }
// 1 поток
jobsQueue.empty() -> false
// 2 поток
jobsQueue.empty() -> false
lock()
...
jobsQueue.pop()
unlock()
// 1 поток
lock()
front() --- а нету такого, уже удален о втором потоке
note173 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.