1 /* 2 * Copyright 2021, Jérôme Duval, jerome.duval@gmail.com. 3 * Distributed under the terms of the MIT License. 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <unistd.h> 8 #include <pthread.h> 9 #include <thread> 10 11 #define CYCLES 2 12 13 14 class MyClass 15 { 16 public: 17 MyClass() { i=0; printf("MyClass() called() %p\n", this); } 18 ~MyClass() { printf("~MyClass() called() %d %p\n", i, this); } 19 20 void Touch() { i++; printf("Touch() called() %d %p\n", i, this); } 21 22 private: 23 int j; 24 int i; 25 }; 26 27 thread_local MyClass myClass1; 28 thread_local MyClass myClass2; 29 30 void* threadFn(void* id_ptr) 31 { 32 int thread_id = *(int*)id_ptr; 33 34 for (int i = 0; i < CYCLES; ++i) { 35 int wait_sec = 1; 36 sleep(wait_sec); 37 myClass1.Touch(); 38 myClass2.Touch(); 39 } 40 41 return NULL; 42 } 43 44 45 int thread_local_test(int count) 46 { 47 pthread_t ids[count]; 48 int short_ids[count]; 49 50 srand(time(NULL)); 51 52 for (int i = 0; i < count; i++) { 53 short_ids[i] = i; 54 pthread_create(&ids[i], NULL, threadFn, &short_ids[i]); 55 } 56 57 for (int i = 0; i < count; i++) 58 pthread_join(ids[i], NULL); 59 60 return 0; 61 } 62 63 64 int main() 65 { 66 thread_local_test(1); 67 } 68