Czy jest możliwość sprawdzenia który wątek wykonuje daną funkcję?

0

Witam,
Piszę program, którego celem będzie m.in. wywołanie metody pewnej klasy, która składa się z licznych obiektów, w wielu wątkach. Każdy z tych obiektów będzie wykorzystywał z innego obiektu utworzonego globalnie w tablicy - dla każdego wątku oddzielnie.
Przykładowo:

const unsigned ilosc_watkow = 5;
GlobaObject g_obiekt[ilosc_watkow]; //dla każdego wątku niezależny obiekt

Zastanawiam się jednak czy da się jakoś zidentyfikować wątek, który jest wykonywany? Chodzi o to jak poinformować każdy z tych obiektów który egzemplarz obiektu globalnego ma wykorzystać?
Mogę oczywiście przekazać go przez referencję/wskaźnik wywołując wątek a następnie przekazać tą referencję/wskaźnik dalej do każdego z podobiektów.
Zastanawiam się jednak czy nie dałoby się tego zrobić jakoś prościej tj. przez przekazywania tego obiektu jako argument funkcji?

Z góry dzięki za pomoc.

4
#include <iostream>
#include <thread>

int main()
{
	std::cout << std::this_thread::get_id();

	return 0;
}
0

Z tego co zrozumiałem to wystarczy, jak będziesz sobie zapisywał ID wątku w jego prywatnym polu klasy (czy jak tam masz ten multithreading zorganizowany).

0

Dzięki, chyba właśnie o to chodziło. Muszę się jeszcze tylko zastanowić jak w miarę szybko zamieniać to ID na index wątku... Chwilowo w głowie mam tylko pętlę, która średnio mi się podoba...
Natomiast zapisywanie ID wewnątrz każdego obiektu również średnio mi się podoba, bo tych obiektów jest sporo. Z drugiej strony takie rozwiązanie jest najszybsze... Grrr...

0

Nie wewnątrz obiektu, na którym wykonujesz operację, tylko wewnątrz obiektu wątku, to coś z lekka innego :P

0
Patryk27 napisał(a):

Nie wewnątrz obiektu, na którym wykonujesz operację, tylko wewnątrz obiektu wątku, to coś z lekka innego :P

@Patryk27 przepraszam, jeśli proszę o zbyt wiele, ale czy mógłbyś podać mi prosty przykład o czym piszesz? Bo trochę tego nie rozumiem, a może rzeczywiście jest to dobre rozwiązanie!

Powiedzmy, że mam coś takiego:

class Object
	{
	//...
	};

class Main
	{
	public:
		Object objects[3]; //dla każdego wątku 1 obiekt
		void Create()
			{
			std::thread* t1 = new thread(&Main::Multi, this);
			std::thread* t2 = new thread(&Main::Multi, this);
			std::thread* t3 = new thread(&Main::Multi, this);
			//...
			}

		void Multi() //metoda wywoływana wielokrotnie
			{
			//korzystamy z wielu obiektów, które operują na jednym z obiektów typu Object (t1 na objects[0], t2 na objects[1] itd.)
			};
	};
0

Musiałbyś stworzyć klasę dziedziczącą po std::thread z polem unsigned int id; (które ustawiałbyś ręcznie w konstruktorze).
Rzecz w tym, że pozostaje kwestia tego, że musiałbyś mieć dostęp do aktualnej instancji wątku - tutaj już nie mam konkretnego przykładu, nigdy nie bawiłem się wątkami w C++.

0

Zamiast przekazywać this przekazuj obiekt innej klasy - do każdego wątka osobny obiekt.

0
Azarien napisał(a):

Zamiast przekazywać this przekazuj obiekt innej klasy - do każdego wątka osobny obiekt.

Trochę nie rozumiem. Piszesz to w kontekście mojego problemu czy jako uwaga poboczna? Dlaczego tak jak napisałem jest źle?
Zastanawiam się również czy w takim razie przekazywać kopię tego obiektu czy referencję?

0

Może spróbuję jeszcze lepiej wytłumaczyć dokładnie o co mi chodzi.
Otóż chodzi o to, że każdy z utworzonych wątków będzie generował liczby losowe (dużo liczb losowych) i chcę utworzyć dla każdego wątku oddzielny generator liczb (tablicę generatorów) by nie było problemów z generowaniem nowych liczb oraz by uniezależnić wątki od siebie (pominę już kwestię wielkości takiego generatora).
Tzn. zrobić coś w stylu:

std::random_device seed; //ziarno dla każdego generatora
vector<std::mt19937> eng; //dla każdego wątku oddzielny generator

Natomiast każdy wątek będzie operował na wielu obiektach składających się z innych podobiektów, które będą wykorzystywać owe generatory.

No i teraz pytanie jak w prosty sposób to zrobić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1