|
Shared Variables in Pthreads
An Introduction |
|
Prof. David Bernstein |
| Computer Science Department |
| bernstdh@jmu.edu |
errno
#include <pthread.h>
#include <stdio.h> // For printf()
#include <stdlib.h> // For exit()
#include <string.h> // For strlen()
#include <unistd.h> // For sleep() if needed
static void
*code_for_thread1(void *arg)
{
int count;
printf("count in thread 1 is initially %d\n", count);
count = 20;
printf("count in thread 1 is finally %d\n", count);
return NULL;
}
int
main(void)
{
int count;
pthread_t thread1;
void *thread1_result;
count = 100;
printf("count in main thread is initially %d\n", count);
pthread_create(&thread1, NULL, code_for_thread1, NULL);
pthread_join(thread1, &thread1_result);
printf("count in main thread is finally %d\n", count);
exit(0);
}
#include <pthread.h>
#include <stdio.h> // For printf()
#include <stdlib.h> // For exit()
#include <string.h> // For strlen()
#include <unistd.h> // For sleep() if needed
int count;
static void
*code_for_thread1(void *arg)
{
printf("count in thread 1 is initially %d\n", count);
count = 20;
printf("count in thread 1 is finally %d\n", count);
return NULL;
}
int
main(void)
{
pthread_t thread1;
void *thread1_result;
count = 10;
printf("count in main thread is initially %d\n", count);
pthread_create(&thread1, NULL, code_for_thread1, NULL);
pthread_join(thread1, &thread1_result);
printf("count in main thread is finally %d\n", count);
exit(0);
}
#include <pthread.h>
#include <stdio.h> // For printf()
#include <stdlib.h> // For exit()
#include <string.h> // For strlen()
#include <unistd.h> // For sleep() if needed
int *ptr;
static void
useless_count(void)
{
int count = 0;
ptr = &count;
count++;
}
static void
*code_for_thread1(void *arg)
{
printf("count in thread 1 is initially %d\n", *ptr);
useless_count();
printf("count in thread 1 is finally %d\n", *ptr);
return NULL;
}
int
main(void)
{
pthread_t thread1;
void *thread1_result;
// What happens if you remove the following statement?
useless_count();
printf("count in main thread is initially %d\n", *ptr);
pthread_create(&thread1, NULL, code_for_thread1, NULL);
pthread_join(thread1, &thread1_result);
printf("count in main thread is finally %d\n", *ptr);
exit(0);
}
#include <pthread.h>
#include <stdio.h> // For printf()
#include <stdlib.h> // For exit()
#include <string.h> // For strlen()
#include <unistd.h> // For sleep() if needed
int *ptr;
static void
running_count(void)
{
static int count = 0;
ptr = &count;
count++;
}
static void
*code_for_thread1(void *arg)
{
printf("count in thread 1 is initially %d\n", *ptr);
running_count();
printf("count in thread 1 is finally %d\n", *ptr);
return NULL;
}
int
main(void)
{
pthread_t thread1;
void *thread1_result;
running_count();
printf("count in main thread is initially %d\n", *ptr);
pthread_create(&thread1, NULL, code_for_thread1, NULL);
pthread_join(thread1, &thread1_result);
printf("count in main thread is finally %d\n", *ptr);
exit(0);
}
main()?main() is the first function
called and doesn't exit until termination)#include <pthread.h>
#include <stdio.h> // For printf()
#include <stdlib.h> // For exit()
#include <string.h> // For strlen()
#include <unistd.h> // For sleep() if needed
int *ptr;
static void
*code_for_thread1(void *arg)
{
printf("count in thread 1 is initially %d\n", *ptr);
*ptr = 20;
printf("count in thread 1 is finally %d\n", *ptr);
return NULL;
}
int
main(void)
{
int count;
pthread_t thread1;
void *thread1_result;
ptr = &count;
count = 10;
printf("count in main thread is initially %d\n", *ptr);
pthread_create(&thread1, NULL, code_for_thread1, NULL);
pthread_join(thread1, &thread1_result);
printf("count in main thread is finally %d\n", *ptr);
exit(0);
}
main() calls
foo() which itself calls bar()?bar() on top of those declared/defined in
foo() on top of those declared/defined in
in main()
#include <pthread.h>
#include <stdio.h> // For printf()
#include <stdlib.h> // For exit()
#include <string.h> // For strlen()
#include <unistd.h> // For sleep() if needed
int *ptr;
static void
some_function(void)
{
printf("count in some_function() in thread 1 is initially %d\n", *ptr);
*ptr = 20;
printf("count in some_function() in thread 1 is finally %d\n", *ptr);
}
static void
*code_for_thread1(void *arg)
{
int count;
ptr = &count;
count = 10;
printf("count in thread 1 is initially %d\n", *ptr);
some_function();
printf("count in thread 1 is finally %d\n", *ptr);
return NULL;
}
int
main(void)
{
pthread_t thread1;
void *thread1_result;
// What happens if the following is included?
//printf("count in main thread is initially %d\n", *ptr);
pthread_create(&thread1, NULL, code_for_thread1, NULL);
pthread_join(thread1, &thread1_result);
// What happens if the following is included?
//printf("count in main thread is finally %d\n", *ptr);
exit(0);
}
#include <pthread.h>
#include <stdio.h> // For printf()
#include <stdlib.h> // For exit()
#include <string.h> // For strlen()
#include <unistd.h> // For sleep() if needed
int *ptr1, *ptr2;
static void
*code_for_thread1(void *arg)
{
static int n_thread1 = 10;
ptr1 = &n_thread1;
printf("n_thread1 in thread 1 %d\n", *ptr1);
// What happens if the following is included?
//printf("n_thread2 in thread 1 %d\n", *ptr2);
return NULL;
}
static void
*code_for_thread2(void *arg)
{
static int n_thread2 = 20;
ptr2 = &n_thread2;
printf("n_thread1 in thread 2 %d\n", *ptr1);
printf("n_thread2 in thread 2 %d\n", *ptr2);
return NULL;
}
int
main(void)
{
pthread_t thread1, thread2;
void *thread1_result, *thread2_result;
pthread_create(&thread1, NULL, code_for_thread1, NULL);
pthread_join(thread1, &thread1_result);
pthread_create(&thread2, NULL, code_for_thread2, NULL);
pthread_join(thread2, &thread2_result);
printf("n_thread1 in main thread after join %d\n", *ptr1);
printf("n_thread2 in main thread after join %d\n", *ptr2);
exit(0);
}