Alcuni background: Sto cercando di rintracciare un bug che mi sta causando grossi grattacapi. Dopo molti vicoli ciechi (vedi this question) ho finalmente finito con questo codice:Il programma si blocca nel debugger di Visual Studio
#include <thread>
#include <vector>
#include <iosfwd>
#include <sstream>
#include <string>
#include <windows.h>
int main()
{
SRWLOCK srwl;
InitializeSRWLock(&srwl);
for(size_t i=0;i<1000;++i)
{
std::vector<std::thread>threads;
for(size_t j=0;j<100;++j)
{
OutputDebugString(".");
threads.emplace_back([&](){
AcquireSRWLockExclusive(&srwl);
//Code below modifies the probability to see the bug.
std::this_thread::sleep_for(std::chrono::microseconds(1));
std::wstringstream wss;
wss<<std::this_thread::get_id();
wss.str();
//Code above modifies the probability to see the bug.
ReleaseSRWLockExclusive(&srwl);});
}
for(auto&t:threads){t.join();}
OutputDebugString((std::to_string(i)+"\n").data());
}
return 0;
}
Quando ho eseguito questo codice all'interno di VS 2013 debugger il programma si blocca con una produzione come questa:
....................................................................................................0
....................................................................................................1
....................................................................................................2
...........................
Stranamente abbastanza, se metto in pausa il debugger e ispeziono cosa sta succedendo, uno dei thread è all'interno di AcquireSRWLockExclusive (in NtWaitForAlertByThreadId) apparentemente non c'è alcun motivo per cui il programma è in sospeso. Quando faccio clic su Riprendi, il programma continua felicemente e stampa un po 'di roba fino a quando non viene bloccato di nuovo.
Avete qualche idea cosa sta succedendo qui?
qualche informazione in più:
- Per quanto posso dire, questo bug esiste solo su Windows 8.1.
- Ho provato VS2013.4 e VS2015 RC.
- Posso riprodurlo su due computer diversi in Windows 8.1.
- Uno della macchina è stato formattato, la RAM, CPU e disco testati (ho pensato a un malfunzionamento, perché in un primo momento ho potuto osservare solo il bug su questa particolare macchina)
- potrei mai riprodurlo su Windows 7.
- Potrebbe essere utile modificare il codice tra i commenti per osservare il bug. Quando ho aggiunto il microsecondo, potrei finalmente riprodurre il bug su un altro computer.
- Con VS2015 RC ho potuto riprodurre lo stesso comportamento con un semplice std :: mutex. Su VS2013 tuttavia SRWLOCK sembra obbligatorio per osservare il bug.
Potrebbe essere in un deadlock e una volta inserito il debugger, la sincronizzazione cambia e il deadlock scompare. – NathanOliver
@NathanOliver Come potrebbe essere possibile? C'è solo un mutex nel codice. – Arnaud
Il programma si blocca quando viene eseguito all'esterno del debugger? –