Olej писал(а): ↑20 фев 2021, 15:12
В отношении самих потоков в C++, по идее, не должно возникать никаких вопросов? ...
Olej писал(а): ↑06 мар 2021, 04:46
Отвлекаясь от предметного разговора:
Энтони Уильямс, Параллельное программирование на С++ в действии
Интересный примерчик по мотивам книжули (см. там стр. 54) - как в качестве функции потока вызвать
метод класса + передать ему его параметры:
Код: Выделить всё
#include <iostream>
#include <atomic> // std::atomic, std::atomic_flag, ATOMIC_FLAG_INIT
#include <thread> // std::thread, std::this_thread::yield
#include <vector> // std::vector
#include <unistd.h>
std::atomic<bool> ready (false);
class X
{
public:
void do_lengthy_work( int tid, long int limit )
{
while (!ready) { std::this_thread::yield(); } // wait for the ready signal
do usleep( 1 );
while (limit--);
std::cout << "поток #" << tid << " завершился" << std::endl;
};
};
int main ()
{
std::vector<X> objs = { X(), X(), X(), X() };
std::cout << "создание потоков, медленно считающих ..." << std::endl;
std::vector<std::thread> threads;
for (long unsigned int i = 0; i < objs.size(); ++i)
{
long int len = 10000 * (i + 1);
threads.push_back(std::thread( &X::do_lengthy_work, &objs[ i ], i, len ) );
}
ready = true;
for (auto& th : threads) th.join();
}
Там нет ничего интересного, можно не вникать
, кроме:
- в создании потока указывается
метод класса X - &X::do_lengthy_work ...
- это делается для разных экземпляров X, и 2-м параметром создания потока
обязательно указывается ссылка на сам объект для которого ... это фактически *this
- и только
затем идут сами параметры вызываемого метода-функции...
Такое не всегда прийдёт в голову когда оно понадобится...
А оно надобится!
Код: Выделить всё
olej@nvme:~/2021/OWN_TEST.codes/asynch$ ./thread2
создание потоков, медленно считающих ...
поток #0 завершился
поток #1 завершился
поток #2 завершился
поток #3 завершился