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