2017-08-16 6 views
0

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; 
} 
+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

Antwort

4

std::thread ‚s constructor kopiert oder verschiebt seine Argumente. std::mutex ist weder kopierbar noch beweglich, also einschließlich, dass als nicht-statisches Datenelement von XHuman diese Klasse nicht kopierbar und unbeweglich macht. Das ist die Ursache für die Fehler, die Sie sehen.

Sie können umgehen, indem Sie einen Zeiger oder einen Verweis auf die XHuman Instanzen übergeben.

XHuman one, two; 
std::thread th1(&XHuman::addValues, &one, 1, 5); 
std::thread th2(&XHuman::eraseValues, std::ref(two), 1); 
+0

genau die richtige Antwort, die ich brauchte. Vielen Dank! – Gibs

Verwandte Themen