1 #include "pseudo_barrier.h" 2 #include "thread.h" 3 #include <chrono> 4 #include <cinttypes> 5 #include <csignal> 6 #include <cstring> 7 #include <thread> 8 #include <unistd.h> 9 #include <vector> 10 11 pseudo_barrier_t barrier; 12 13 static void sigusr1_handler(int signo) { 14 char buf[100]; 15 snprintf(buf, sizeof(buf), "received SIGUSR1 on thread id: %" PRIx64 "\n", 16 get_thread_id()); 17 write(STDOUT_FILENO, buf, strlen(buf)); 18 } 19 20 static void thread_func() { 21 pseudo_barrier_wait(barrier); 22 std::this_thread::sleep_for(std::chrono::minutes(1)); 23 } 24 25 int main(int argc, char **argv) { 26 int num = atoi(argv[1]); 27 28 pseudo_barrier_init(barrier, num + 1); 29 30 signal(SIGUSR1, sigusr1_handler); 31 32 std::vector<std::thread> threads; 33 for(int i = 0; i < num; ++i) 34 threads.emplace_back(thread_func); 35 36 pseudo_barrier_wait(barrier); 37 38 puts("@started"); 39 40 for (std::thread &thread : threads) 41 thread.join(); 42 return 0; 43 } 44