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 for (int i = 0; i < 300; ++i) { 26 std::printf("thread %" PRIx64 " running\n", get_thread_id()); 27 std::this_thread::sleep_for(std::chrono::milliseconds(200)); 28 } 29 } 30 31 int main(int argc, char **argv) { 32 int num = atoi(argv[1]); 33 34 pseudo_barrier_init(barrier, num + 1); 35 36 signal(SIGUSR1, sigusr1_handler); 37 38 std::vector<std::thread> threads; 39 for(int i = 0; i < num; ++i) 40 threads.emplace_back(thread_func); 41 42 pseudo_barrier_wait(barrier); 43 44 std::puts("@started"); 45 46 for (std::thread &thread : threads) 47 thread.join(); 48 return 0; 49 } 50