1*99451b44SJordan Rupprecht #include <stdio.h> 2*99451b44SJordan Rupprecht #include <chrono> 3*99451b44SJordan Rupprecht #include <thread> 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht using std::chrono::microseconds; 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht volatile int g_thread_2_continuing = 0; 8*99451b44SJordan Rupprecht 9*99451b44SJordan Rupprecht void * thread_1_func(void * input)10*99451b44SJordan Rupprechtthread_1_func (void *input) 11*99451b44SJordan Rupprecht { 12*99451b44SJordan Rupprecht // Waiting to be released by the debugger. 13*99451b44SJordan Rupprecht while (!g_thread_2_continuing) // Another thread will change this value 14*99451b44SJordan Rupprecht { 15*99451b44SJordan Rupprecht std::this_thread::sleep_for(microseconds(1)); 16*99451b44SJordan Rupprecht } 17*99451b44SJordan Rupprecht 18*99451b44SJordan Rupprecht // Return 19*99451b44SJordan Rupprecht return NULL; // Set third breakpoint here 20*99451b44SJordan Rupprecht } 21*99451b44SJordan Rupprecht 22*99451b44SJordan Rupprecht void * thread_2_func(void * input)23*99451b44SJordan Rupprechtthread_2_func (void *input) 24*99451b44SJordan Rupprecht { 25*99451b44SJordan Rupprecht // Waiting to be released by the debugger. 26*99451b44SJordan Rupprecht int child_thread_continue = 0; 27*99451b44SJordan Rupprecht while (!child_thread_continue) // The debugger will change this value 28*99451b44SJordan Rupprecht { 29*99451b44SJordan Rupprecht std::this_thread::sleep_for(microseconds(1)); // Set second breakpoint here 30*99451b44SJordan Rupprecht } 31*99451b44SJordan Rupprecht 32*99451b44SJordan Rupprecht // Release thread 1 33*99451b44SJordan Rupprecht g_thread_2_continuing = 1; 34*99451b44SJordan Rupprecht 35*99451b44SJordan Rupprecht // Return 36*99451b44SJordan Rupprecht return NULL; 37*99451b44SJordan Rupprecht } 38*99451b44SJordan Rupprecht main(int argc,char const * argv[])39*99451b44SJordan Rupprechtint main(int argc, char const *argv[]) 40*99451b44SJordan Rupprecht { 41*99451b44SJordan Rupprecht lldb_enable_attach(); 42*99451b44SJordan Rupprecht 43*99451b44SJordan Rupprecht // Create a new thread 44*99451b44SJordan Rupprecht std::thread thread_1(thread_1_func, nullptr); 45*99451b44SJordan Rupprecht 46*99451b44SJordan Rupprecht // Waiting to be attached by the debugger. 47*99451b44SJordan Rupprecht int main_thread_continue = 0; 48*99451b44SJordan Rupprecht while (!main_thread_continue) // The debugger will change this value 49*99451b44SJordan Rupprecht { 50*99451b44SJordan Rupprecht std::this_thread::sleep_for(microseconds(1)); // Set first breakpoint here 51*99451b44SJordan Rupprecht } 52*99451b44SJordan Rupprecht 53*99451b44SJordan Rupprecht // Create another new thread 54*99451b44SJordan Rupprecht std::thread thread_2(thread_2_func, nullptr); 55*99451b44SJordan Rupprecht 56*99451b44SJordan Rupprecht // Wait for the threads to finish. 57*99451b44SJordan Rupprecht thread_1.join(); 58*99451b44SJordan Rupprecht thread_2.join(); 59*99451b44SJordan Rupprecht 60*99451b44SJordan Rupprecht printf("Exiting now\n"); 61*99451b44SJordan Rupprecht } 62