🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.c
11 messages
11 total messages Started by Borneq Sat, 13 Jan 2018 13:09
Szukam przykładu thread_pool
#309611
Author: Borneq
Date: Sat, 13 Jan 2018 13:09
23 lines
1717 bytes
Jest tylko https://exceptionshub.com/thread-pooling-in-c11.html
i identyczny na Stack Overflow, czyli
#include <ctpl.h>  // or <ctpl_stl.h> if ou do not have Boost library

int main (int argc, char *argv[]) {
     ctpl::thread_pool p(2 /* two threads in the pool */);
     int arr[4] = {0};
     std::vector<std::future<void>> results(4);
     for (int i = 0; i < 8; ++i) { // for 8 iterations,
         for (int j = 0; j < 4; ++j) {
             results[j] = p.push([&arr, j](int){ arr[j] +=2; });
         }
         for (int j = 0; j < 4; ++j) {
             results[j].get();
         }
         arr[4] = *std::min_element(arr, arr + 4);
     }
}

(gdzie ostatni wiersz nie będący klamrą poprawiłem dając gwiazdkę)
Szukam sensownym przykładów kodu w C++, tak by działanie było podobne do 
tego opisu w Wikipedii:
https://en.wikipedia.org/wiki/Thread_pool
Re: Szukam przykładu thread_pool
#309612
Author: Borneq
Date: Sat, 13 Jan 2018 19:25
13 lines
1342 bytes
W dniu 13.01.2018 o 14:09, Borneq pisze:
> https://en.wikipedia.org/wiki/Thread_pool

Standardowy przykład: 
https://github.com/vit-vit/CTPL/blob/master/example.cpp

1. co znaczy  } second(", functor");w linii 50?
2.
co znaczy:
std::future<void> qw = p.push(std::ref(first));  // function
poza tym są : p.push(aga, 7);  // function
poza tym jak wołać asynchronicznie metodę obiektu?
co znaczy p.push(Second(", functor"));  // functor, move ctor
Re: Szukam przykładu thread_pool
#309613
Author: Borneq
Date: Sat, 13 Jan 2018 19:33
25 lines
1723 bytes
Albo :
#include "ctpl_stl.h"
#include <iostream>
#include <string>

void first(int id) { std::cout << "first hello from " << id << '\n'; }

struct Second { void operator()(int id) const { std::cout << "second 
hello from " << id << '\n'; } } second;

void third(int id, const std::string & additional_param) {}

int main() {
	ctpl::thread_pool p(2 /* two threads in the pool */);
	p.push(first); // function
	p.push(third, "additional_param");
	p.push([](int id) { std::cout << "hello from " << id << '\n'; }); // lambda
	p.push(std::ref(second)); // functor, reference
	p.push(const_cast<const Second &>(second)); // functor, copy ctor
	p.push(std::move(second)); // functor, move ctor
	printf("koniec\n");
	while(true);
}

są dwa wątki w p, ale jest aż 6 razy push, co robi push?
Re: Szukam przykładu thread_pool
#309614
Author: Borneq
Date: Sat, 13 Jan 2018 20:08
4 lines
1110 bytes
W dniu 13.01.2018 o 20:33, Borneq pisze:
> są dwa wątki w p, ale jest aż 6 razy push, co robi push?

Doszedłem do tego że push uruchamia wątek, a pop?
Re: Szukam przykładu thread_pool
#309615
Author: bartekltg
Date: Sun, 14 Jan 2018 03:33
101 lines
4416 bytes
On Saturday, January 13, 2018 at 8:25:16 PM UTC+1, Borneq wrote:
> W dniu 13.01.2018 o 14:09, Borneq pisze:
> > https://en.wikipedia.org/wiki/Thread_pool
> 
> Standardowy przykład: 
> https://github.com/vit-vit/CTPL/blob/master/example.cpp
> 
> 1. co znaczy  } second(", functor");w linii 50?

Popatrz wyzej. 

class Tbla {
  //implementa ja klasy Tbla
} bla1(1), bla2(), bla3("tdsr");


Tworzysz tam obiekt dopiero co zdesiniowanej klasy Second
odpalajac konstruktor z łancuchem ", functor" jako argumentem

> 2.
> co znaczy:
> std::future<void> qw = p.push(std::ref(first));  // function

Dodajesz do kolejki rzeczy do odpalenia funkję first.
Push zwraca future do wyniku. first zwraca void, więc sam
wynik nieprzydatny, bo go nie ma, ale i tak możesz
takeigo future'a uzyc do poczekania na zakończenie działania
funkcji albo sprawdzenia czy funkcja już zakonczyla działanie.  
https://stackoverflow.com/a/10891052

> poza tym są : p.push(aga, 7);  // function

Dodaje do kolejki funkcję aga, która zostanie odpalona
z arumentami aga(numer_watku, 7)

> poza tym jak wołać asynchronicznie metodę obiektu?

Tak jak do każdego czegoś, co potrzebuje funkcji,
thread czy async. 

Sposób 1: chyba toto się nazywa pointer to member function.

Mamy klasę 
class bla{
  void run (int a, double b);
}

teraz &bla::run jest w pewnym sensie funkkcją, która pobiera trzy parametry,
wskaźnik do klasy typu bla, a, b.

Więc odpalasz 

p.push( &bla::run, &bla1, a, b );
http://thispointer.com/c11-start-thread-by-member-function-with-arguments/

Tylko tu twoja kalsa musi być kompatybilna z pulą, bo ta chce, by wszytko,
co wejdzie jako jej pierwszy argument było intem - numerem watku.
b
Sposb 2, lepszy. Daj jej lambdę. 

bla bla1;
p.push(  [&bla1](int id, int a, double ) {bla.run(a,b);}   );


> co znaczy p.push(Second(", functor"));  // functor, move ctor

A bo widzisz, w kolejce nie muszą siedzieć tylko funkcje. Możesz
podać obiekt funkcyjny - taki obiekt, który ma operator ().
Wizualnie odpala się go jak funkcja. I na pewno używając c++
niejednokrotnie takich obiektów uzywaleś. std::less<int>() ;-)

No to pchasz tam taki obiekt, powstały przez odpalenie takeigo
a nie innego konstruktora klalsy Second. 

Większość tych pytań nie ma nic wspolnego z tą biblioteką
czy pulami wątków, a ze zwykłym c++.


> są dwa wątki w p, ale jest aż 6 razy push, co robi push? 

Dodaje zadania do kolejki zadań. 

A wątki je sobie bądą po kolei wybierać i wykonywać. 

 
> Doszedłem do tego że push uruchamia wątek, 

Nie! 
On dodaje zadanie. Wątki są dawno uruchomione
i siorbią sobie powolutku zadania z kolejki. 

> a pop? 

Zapewne wyzciąga zadanie z kolejki. To jeszcze nie wykonane.
Do tego odpowiednio opakowane, a nie w oryginalnej formie. 

Znajdź bibliotekę z dokumentacją;-)
A jak nie, to musisz czytać kod;]

pzdr
bartekltg
Re: Szukam przykładu thread_pool
#309616
Author: Borneq
Date: Sun, 14 Jan 2018 05:13
9 lines
1305 bytes
W dniu 14.01.2018 o 04:33, bartekltg pisze:
> Nie!
> On dodaje zadanie. Wątki są dawno uruchomione
> i siorbią sobie powolutku zadania z kolejki.

Dzięki!
czyli mamy tu rozdzielenie zadań od wątków?
jak zadanie się skończy, to nowe wpada no wątku który jest wolny, jak 
rozumiem.
Re: Szukam przykładu thread_pool
#309617
Author: Borneq
Date: Sun, 14 Jan 2018 05:23
19 lines
1572 bytes
W dniu 14.01.2018 o 04:33, bartekltg pisze:
> class bla{
>    void run (int a, double b);
> }

> Tylko tu twoja kalsa musi być kompatybilna z pulą, bo ta chce, by wszytko,
> co wejdzie jako jej pierwszy argument było intem - numerem watku.

Tego do końca nie rozumiem: argument "int a" w run jest numerem wątku?
i każda funkcja podobnie?
Czy to oznacza że w push pomija się akurat ten argument:
void first(int id)
p.push(first);
czyli dla bla::run kolejno:
- &bla::run
- wskaźnik na obiekt klasy bla
- tu pomijamy int a
- następnie wsadzamy double b
?
Re: Szukam przykładu thread_pool
#309618
Author: Borneq
Date: Sun, 14 Jan 2018 19:44
51 lines
1913 bytes
Biorę implementację z https://github.com/progschj/ThreadPool
wpisuje do puli za pomocą emplace_back
potem odpytuję:
	for (auto &&result : results)
		std::cout << result.get() << std::endl;
ALE to ma wadę: jeśli pierwszy result trwa najdłużej, to czeka na niego, 
potem szybko wypluwa wyniki dalsze:521. A ja bym chciał od razu dostawać 
125.

#include <iostream>
#include "ThreadPool.h" //https://github.com/progschj/ThreadPool

int main()
{
	ThreadPool pool(8);

	std::vector<std::future<int>> results;

	results.emplace_back(
		pool.enqueue([]
	{
		std::this_thread::sleep_for(std::chrono::seconds(5));
		return 5;
	})
	);


	results.emplace_back(
		pool.enqueue([]
	{
		std::this_thread::sleep_for(std::chrono::seconds(2));
		return 2;
	})
	);


	results.emplace_back(
		pool.enqueue([]
	{
		std::this_thread::sleep_for(std::chrono::seconds(1));
		return 1;
	})
	);
	
	for (auto &&result : results)
		std::cout << result.get() << std::endl;

	while(true);
	return 0;

}
Re: Szukam przykładu thread_pool
#309619
Author: Borneq
Date: Sun, 14 Jan 2018 19:57
10 lines
1418 bytes
W dniu 14.01.2018 o 20:44, Borneq pisze:
> Biorę implementację z https://github.com/progschj/ThreadPool
> wpisuje do puli za pomocą emplace_back
> potem odpytuję:
>      for (auto &&result : results)
>          std::cout << result.get() << std::endl;

Przykładowo: chcę by liczby 1,2 i 5 były dodawane do globalnego wektora 
od razu gdy task się skończy. Wtedy musiałaby być podawana referencja do 
tego wektora do tych tasków oraz muteksy. Jak to mogło by wyglądać?
Re: Szukam przykładu thread_pool
#309620
Author: Sebastian Biały
Date: Mon, 15 Jan 2018 18:38
8 lines
1205 bytes
On 1/13/2018 2:09 PM, Borneq wrote:
> Szukam sensownym przykładów kodu w C++, tak by działanie było podobne do 
> tego opisu w Wikipedii:
> https://en.wikipedia.org/wiki/Thread_pool

http://doc.qt.io/qt-5/qthreadpool.html

http://www.bogotobogo.com/Qt/Qt5_QTcpServer_QThreadPool_Multithreaded_Client_Server.php
Re: Szukam przykładu thread_pool
#309621
Author: M.M.
Date: Tue, 16 Jan 2018 03:02
13 lines
1818 bytes
On Monday, January 15, 2018 at 7:38:14 PM UTC+1, Sebastian Biały wrote:
> On 1/13/2018 2:09 PM, Borneq wrote:
> > Szukam sensownym przykładów kodu w C++, tak by działanie było podobne do 
> > tego opisu w Wikipedii:
> > https://en.wikipedia.org/wiki/Thread_pool
> 
> http://doc.qt.io/qt-5/qthreadpool.html
> 
> http://www.bogotobogo.com/Qt/Qt5_QTcpServer_QThreadPool_Multithreaded_Client_Server.php

Fajne.

Pozdrawiam
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads