LINUX.ORG.RU

СИ++ параллельные вычисления (многопоточность)

 , ,


1

2

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

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

данная программа выдает ошибку:

/usr/include/c++/8.2.1/thread:120:17: error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues
  static_assert( __is_invocable<typename decay<_Callable>::type,
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           typename decay<_Args>::type...>::value,
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


не пойму, что хочет оно? какие аргументы он имеет ввиду, как преобразованые в rvalue?

весь проект

★★

Последнее исправление: safocl (всего исправлений: 3)

какие аргументы он имеет ввиду, как преобразованые в rvalue?

Он имеет в виду, что твоя parallel1_genOneBoardCard принимает lvalue-ссылки, а передать аргументы в другой поток можно только как rvalue.

https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/include/std/thread...

З.Ы. Флэш пишется как flush, а не flash

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

видил, смотрел, даже класс thread немного поизучал из либы)))
но чот не понял из-за чего он енто ругается?
понял чо аргументы должны быть доступны после преобразования в rvalues, однако, не могу понять почему они не доступны после такого преобразования?

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

просмотрел, но чот я все равно не монял, к какому именно аргументу он не может применить преобразование?

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

Да хоть к первому. Функция хочет vector<Card>&, а ее вызывают с vector<Card>. Какого же типа должен быть аргумент, чтобы в нее можно было по значению передать vector<Card>? (как минимум три правильных ответа)

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

ты хочеш сказать, что надо в описании и определении функции параметры указывать не по ссылке?

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

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

т.е.
f(vector<Card> & vec_c) будет тождественно

vector<Card> var;
f()
{
vector<Card> & vec_c = var;
}
только определяется ента ссылка в блоке аргументов и присваивается ей значение переданного аргумента, в данном случае адрес переменной

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от annulen

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

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

кстати, если parallel1_genOneBoardCard упаковать в лямбду, то все роббит. однако, я не пойму, в лямбде ставлю [&](){}, т.е. передаю все значения по ссылке.
значение по ссылке будут относительно скопированных значений в новый поток или же будут относительно основного потока?

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

Это верно, но вышесказанное из этого не следует

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

да, убрал из описания и определения функции векторы по ссылке, сделал по значению и все взлетело.

только не понял почему))

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

просто если функцию вызывать не в thread(), то все нормально роббит и с передачей по ссылке.

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

и походу кстати понял, но хз правильно или нет...

для использования в моем случае надо rvalue (vector<Card>&&) аргумент, что бы его можно было использовать с правой стороны для взятия с него значений. А передавая как lvalue (vector<Card>&) с него значения не могут браться.
так ?

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

vector<Card>&& лучше, так как аргумент будет перемещен. С константными ссылками или без ссылок - скопирован.

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

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

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

Дебильное сообщение значит, что функцию должно быть возможно вызвать со всеми аргументами преобразованными к категории rvalue. А vector<Card> & не может быть привязан к rvalue значению, требуется lvalue так как ссылка не на константный тип.

Refrash

refresh

xaizek ★★★★★
()

jollheef а почему ты банишь меня одного, якобы за мат с -10 скора, а поиском я вижу 785 «пидорасов»?

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

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

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

Какая-то каша в голове у тебя. Конструкторы нужны, чтобы код компилировался, а работать потоки будут «правильно» в любом случае. Если ты будешь передавать объекты с использованием std::move в функцию, принимающую rvalue-ссылки, то конструктор перемещения понадобится, но если выполняются некоторые условия [1], то компилятор может сгенерить его сам

[1] https://en.cppreference.com/w/cpp/language/move_constructor#Implicitly-declar...

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