diff --git a/trunk/research/thread-model/.gitignore b/trunk/research/thread-model/.gitignore index 1abd1fc862..5737fff3e8 100644 --- a/trunk/research/thread-model/.gitignore +++ b/trunk/research/thread-model/.gitignore @@ -1,3 +1,4 @@ thread-local udp-connect-client udp-connect-server +extern-main diff --git a/trunk/research/thread-model/extern-extra.cpp b/trunk/research/thread-model/extern-extra.cpp new file mode 100644 index 0000000000..f203776488 --- /dev/null +++ b/trunk/research/thread-model/extern-extra.cpp @@ -0,0 +1,13 @@ + +#include + +int __thread ga = 100; +int __thread gb = 200; + +void* pfn2(void* arg) +{ + printf("Thread2: ga=%d, gb=%d\n", ga, gb); + return NULL; +} + + diff --git a/trunk/research/thread-model/extern-main.cpp b/trunk/research/thread-model/extern-main.cpp new file mode 100644 index 0000000000..33c4f446f9 --- /dev/null +++ b/trunk/research/thread-model/extern-main.cpp @@ -0,0 +1,36 @@ +/* +g++ -std=c++11 -g -O0 extern-main.cpp extern-extra.cpp -o extern-main +*/ +#include +// @see https://linux.die.net/man/3/pthread_create +#include + +/* +Main: ga=100, gb=1867710016 +Thread1: ga=100, gb=1867710016 +Thread2: ga=100, gb=200 +*/ +extern __thread int ga; +extern int gb; + +void* pfn(void* arg) +{ + printf("Thread1: ga=%d, gb=%d\n", ga, gb); + return NULL; +} + +extern void* pfn2(void* arg); + +int main(int argc, char** argv) +{ + printf("Main: ga=%d, gb=%d\n", ga, gb); + + pthread_t trd = NULL; + pthread_create(&trd, NULL, pfn, NULL); + pthread_join(trd, NULL); + + pthread_t trd2 = NULL; + pthread_create(&trd2, NULL, pfn2, NULL); + pthread_join(trd2, NULL); + return 0; +}