Sperren eines Teils des Speichers für Multithreading - C ++, Multithreading, C ++ 11

Ich versuche, Code zu schreiben, der Threads erstellt, die verschiedene Teile des Speichers gleichzeitig ändern können. Ich habe gelesen, dass a mutex wird normalerweise verwendet, um Code zu sperren, aber ich bin mir nicht sicher, ob ich das in meiner Situation verwenden kann. Beispiel:

using namespace std;
mutex m;
void func(vector<vector<int> > &a, int b)
{
lock_guard<mutex> lk(m);
for (int i = 0; i < 10E6; i++) { a[b].push_back(1); }
}

int main()
{
vector<thread> threads;
vector<vector<int> > ints(4);
for (int i = 0; i < 10; i++)
{
threads.push_back(thread (func, ref(ints), i % 4));
}
for (int i = 0; i < 10; i++) { threads[i].join(); }
return 0;
}

Momentan sperrt der Mutex nur den Code darin func, also (glaube ich) muss jeder Thread nur warten bis der vorherige fertig ist.

Ich versuche, das Programm zu bekommen, um die 4 Vektoren von zu bearbeiten ints zur gleichen Zeit, aber das merkt, dass es warten muss, bis ein anderer Thread fertig ist, einen dieser Vektoren zu bearbeiten, bevor er den nächsten startet.

Antworten:

3 für die Antwort № 1

Ich denke du willst folgendes: (eins std::mutex durch std::vector<int>)

std::mutex m[4];
void func(std::vector<std::vector<int> > &a, int index)
{
std::lock_guard<std::mutex> lock(m[index]);
for (int i = 0; i < 10E6; i++) {
a[index].push_back(1);
}
}

1 für die Antwort № 2

Haben Sie darüber nachgedacht, a Semaphor anstelle eines Mutex?

Die folgenden Fragen könnten Ihnen helfen:

Semaphore gegen Mutex

Wann sollten wir Mutex verwenden und wann sollten wir Semaphore verwenden


0 für die Antwort № 3

Versuchen:

void func(vector<vector<int> > &a, int b)
{
for (int i=0; i<10E6; i++) {
lock_guard<mutex> lk(m);
a[b].push_back(1);
}
}

Sie müssen Ihren Mutex nur sperren, während Sie auf das gemeinsame Objekt zugreifen (a). Die Art, wie Sie es implementiert haben func bedeutet, dass ein Thread die gesamte Schleife beenden muss, bevor die nächste gestartet werden kann.