There might also be more questions than you have time to answer, but do as many as you can.
// nothreads.c #include <stdio.h> #define KILO 1024 #define MEGA (KILO*KILO) // 1048576 #define GIGA (KILO*KILO*KILO) // 1073741824 char data[GIGA]; int main(void) { // Fill with a billion 'x' for (int i = 0; i < GIGA; ++i) data[i] = 'x'; // Check for (int i = 0; i < GIGA; ++i) if (data[i] != 'x') printf("Wrong!\n"); } |
Här är programmet threads-1.c, som gör samma sak, men när det fyller arrayen delar det upp arbetet på två trådar:
// threads-1.c #include <stdio.h> #include <pthread.h> #define KILO 1024 #define MEGA (KILO*KILO) // 1048576 #define GIGA (KILO*KILO*KILO) // 1073741824 char data[GIGA]; void *thread_body_1(void *arg) { for (int i = 0; i < GIGA / 2; ++i) data[i] = 'x'; return NULL; } void *thread_body_2(void *arg) { for (int i = GIGA / 2; i < GIGA; ++i) data[i] = 'x'; return NULL; } int main(void) { // Fill with a billion 'x', in two threads pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_body_1, NULL); pthread_create(&thread2, NULL, thread_body_2, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); // Check for (int i = 0; i < GIGA; ++i) if (data[i] != 'x') printf("Wrong!\n"); } |
I programmet threads-2.c har vi ändrat ordningen på några av satserna i main-funktionen, så den ser ut så här:
int main(void) { // Fill with a billion 'x', in two threads pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_body_1, NULL); pthread_join(thread1, NULL); pthread_create(&thread2, NULL, thread_body_2, NULL); pthread_join(thread2, NULL); // Check for (int i = 0; i < GIGA; ++i) if (data[i] != 'x') printf("Wrong!\n"); } |
Slutligen finns programmet threads-3.c, där anropen till pthread_join saknas, så main-funktionen ser ut så här:
int main(void) { // Fill with a billion 'x', in two threads pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_body_1, NULL); pthread_create(&thread2, NULL, thread_body_2, NULL); // Check for (int i = 0; i < GIGA; ++i) if (data[i] != 'x') printf("Wrong!\n"); } |
Vi provkör de fyra olika programmen, och mäter körtiden. Fungerar allihop? Hur lång tid kan vi förvänta oss att de tar att köra?
// threads-4.c #include <stdio.h> #include <pthread.h> #define KILO 1024 #define MEGA (KILO*KILO) // 1048576 #define GIGA (KILO*KILO*KILO) // 1073741824 char data[GIGA]; void *thread_body_1(void *arg) { for (int i = 0; i < GIGA; i += 2) data[i] = 'x'; return NULL; } void *thread_body_2(void *arg) { for (int i = 1; i < GIGA; i += 2) data[i] = 'x'; return NULL; } int main(void) { // Fill with a billion 'x', in two threads pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_body_1, NULL); pthread_create(&thread2, NULL, thread_body_2, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); // Check for (int i = 0; i < GIGA; ++i) if (data[i] != 'x') printf("Wrong!\n"); } |
Fungerar det? Kan vi gissa något om körtiden?