Warum erhalte ich einen Fehler, wenn ich versuche, std::mutex mtx
in einem Objekt zu platzieren? Wenn es als global deklariert ist, gibt es keinen Fehler. Stimmt etwas nicht mit meiner Syntax?Mutex als privates Mitglied deklariert generiert einen Fehler, aber nicht, wenn es global ist
Der Fehler sagt:
std::tuple<void (__thiscall XHuman::*)(int),XHuman,int>::tuple(std::tuple<void (__thiscall XHuman::*)(int),XHuman,int> &&)': cannot convert argument 1 from 'void (__thiscall XHuman::*)(int)' to 'std::allocator_arg_t
std::tuple<void (__thiscall XHuman::*)(int,int),XHuman,int,int>::tuple': no overloaded function takes 4 arguments
Dies ist mein Code
#include "stdafx.h"
#include <vector>
#include <Windows.h>
#include <thread>
#include <mutex>
class XHuman
{
private:
std::vector<int> m_coordinates;
std::mutex mtx;
public:
XHuman() {
printf("Initialized XHuman\n");
for (int i = 0; i < 5; ++i){
m_coordinates.push_back(i);
}
}
std::vector<int> Coordinates() { return m_coordinates; }
void operator()() {
printf("hello\n");
}
void addValues(int val, int multiple)
{
std::lock_guard<std::mutex> guard(mtx);
for (int i = 0; i < multiple; ++i){
m_coordinates.push_back(val);
printf("pushed_back %d\n", val);
Sleep(100);
}
printf("m_coordinates.size() = %d\n", m_coordinates.size());
}
void eraseValues(int multiple)
{
std::lock_guard<std::mutex> guard(mtx);
for (int i = 0; i < multiple; ++i) {
m_coordinates.pop_back();
printf("m_coordinates.size() = %d\n", m_coordinates.size());
}
}
};
int main()
{
std::thread th1(&XHuman::addValues, XHuman(), 1, 5);
std::thread th2(&XHuman::eraseValues, XHuman(), 1);
th1.join();
th2.join();
return 0;
}
Sie wahrscheinlich die gleiche Instanz von 'XHuman' für beide Threads verwenden wollen, sonst nicht viel für einen Mutex gibt es hier. Siehe @Praetorian Antwort dafür, nur '& one' an beide Threads übergeben. – Holt