Jak używać "std::mutex" razem z funktorami?

0

Chce pozbyć się efektu wyścigu wątków, najbardziej podstawowe nażedzie to mutex i lock_guard
i teraz tak kiedy używam tego z funkcjemi wszystko działa poprawnie tekst wyświetla się na przemiennie
ale jak chce tego użyć z funktorami to mam taki błąd
error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function
przecież żadna funkcja nie jest usunięta więc o co chodzi??

#include <iostream>
#include <thread>
#include <mutex>

class thread_guard
{
	private:
		std::thread m_thread;
	public:
		thread_guard(std::thread t)
		{
			m_thread = std::move(t);
			if (!m_thread.joinable())
				std::cout << "Brak watku!!!" << std::endl;
		}
		~thread_guard()
		{
			m_thread.join();
		}
};

class func
{
	private:
		std::mutex mut;
	public:
		void operator()()
		{			
			for (int i = 0; i < 11000; i++)
			{
				std::lock_guard<std::mutex> guard(mut);
				std::cout << "watek dziala 1" << std::endl;
			}
		}
};

class func2
{
	private:
		std::mutex mut;
	public:
		void operator()()
		{			
			for (int i = 0; i < 11000; i++)
			{
				std::lock_guard<std::mutex> guard(mut);
				std::cout << "watek dziala 2" << std::endl;
			}
		}
};

std::mutex mut2;

void fun()
{	
	for (int i = 0; i < 11000; i++)
	{
		std::lock_guard<std::mutex> guard(mut2);
		std::cout << "watek dziala 1" << std::endl;		
	}
}

void fun2()
{	
	for (int i = 0; i < 11000; i++)
	{
		std::lock_guard<std::mutex> guard(mut2);
		std::cout << "watek dziala 2" << std::endl;
	}
}

int main(void)
{
	thread_guard t1( (std::thread( func() )) );
	thread_guard t2( (std::thread(func2() )) );
	//thread_guard t1((std::thread(fun)));
	//thread_guard t2((std::thread(fun2)));
}
1

std::mutex nie może zostać skopiowany bądź przeniesiony. http://en.cppreference.com/w/cpp/thread/mutex/mutex

0

w którym miejscu jest kopiowany??

0

Tutaj:

    thread_guard t1( (std::thread( func() )) );
    thread_guard t2( (std::thread(func2() )) );
0

chodzi o to że tworze obiekt tymczasowy i potem jest kopiowany do klasy,
czy że klasa thread robi kopie togo co ma na konstruktorze a może jedno i drugie??

0

Chodzi o obiekt tymczasowy typu func lub func2. Nie możesz go skopiować/przenieść. Jeśli chodzi o std::thread to jest on przenoszalny.

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