Hallo SO! Gibt es bei jeder Änderung eine Möglichkeit, dass der "wartende Thread" den "Buff" nicht aktualisiert bekommt? sollte ich einen lock_guard in den thread einfügen, der den "buff" ändert? Ich habe über Speicher Zäune auf einige Artikel gelesen, wie diese: https://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/ und ich bin nur besorgt darüber. Vielen Dank im Voraus ...kann ein geteilter Puffer threadsicher mit std :: atomic flags sein? Gibt es einen effizienteren Weg dies zu tun?
#include <iostream>
#include <thread>
#include <chrono>
#include <atomic>
int main(){
std::atomic<bool> ready(false);
char buff[20]= "hello";
std::cout << "creating thread to change \"buff\"..." << std::endl;
std::thread tr(
[ & ready, & buff ](){
std::this_thread::sleep_for(std::chrono::milliseconds(100));
//should i put a lock_guard here?
buff[0]= 'w'; buff[1]= 'o';
buff[2]= 'r'; buff[3]= 'l';
buff[4]= 'd'; buff[5]= '\0';
std::cout << "buffer changed! sending signal to waiting thread..." << std::endl;
ready= true;
});
tr.detach();
std::cout << "...waiting for the change..." << std::endl;
while(!ready);
std::cout << "...got it! buff=" << buff << std::endl;
}
Ihr Programm weist ein undefiniertes Verhalten auf, indem es 'tr.join()' oder 'tr.detach()' nicht aufruft, bevor 'tr' den Gültigkeitsbereich verlässt. Außerdem würde das Ersetzen der Besetztzeichen "while (! Ready);" mit "tr.join()" den gleichen Nettoeffekt haben, aber viel effizienter sein. –
danke, du hast Recht ... ich habe es bearbeitet und die detach() jetzt ... ich bin nicht daran interessiert, die Join, ich möchte den Thread unabhängig voneinander laufen – enger