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