2015-02-28 2 views
0

Я пытаюсь научиться создавать темы в с помощью PTHREAD библиотеки, я использую следующий код:создания потоков с использованием pthread.c

#include <stdlib.h> 
#include <stdio.h> 
#include <semaphore.h> 
#include <pthread.h> 


static int glob = 0; 
static sem_t sem; 


static void *threadFunc(void *arg) { 

    int loops = *((int *) arg); 
    int loc, j; 

    for (j = 0; j < loops; j++) { 

    if (sem_wait(&sem) == -1) 
     exit(2); 

    loc = glob; 
    loc++; 
    glob = loc; 

     if (sem_post(&sem) == -1) 
     exit(2); 
    } 

    printf("\n%d %d\n",glob/20,glob); 
    return NULL; 
} 



int main(int argc, char *argv[]) { 

    pthread_t t1, t2, t3, t4; 
    int s; 
    int loops = 20; 

    if (sem_init(&sem, 0, 1) == -1) { 
    printf("Error, init semaphore\n"); 
    exit(1); 
    } 

    s = pthread_create(&t1, NULL, threadFunc, &loops); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    s = pthread_create(&t2, NULL, threadFunc, &loops); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    s = pthread_create(&t3, NULL, threadFunc, &loops); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    s = pthread_create(&t4, NULL, threadFunc, &loops); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    s = pthread_join(t1, NULL); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    s = pthread_join(t2, NULL); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    s = pthread_join(t3, NULL); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    s = pthread_join(t4, NULL); 
    if (s != 0) { 
    printf("Error, creating threads\n"); 
    exit(1); 
    } 

    printf("glob value %d \n", glob); 
    exit(0); 
} 

Каковы ожидаемые значения Glob, когда я пытаюсь распечатать их, используя оператор печати в threadFunc? Шуолд они 20,40,60 и 80? Когда я выполняю вышеуказанную программу, я получаю разные значения для glob like, 61, 50, 73 и 80 !! или 29,76,78,80? Как так? EVerytime I execute Я получаю разные значения для glob. Я думаю, что это имеет какое-то отношение к семафору, но как же можно уменьшить значение для glob, как в первом примере, который я вам дал?

Кроме того, какова цель для thread_initiate, заданного pthread_create? Not threadFunc конкретно, но в целом, что программисты, занимающиеся потоками в c, обычно используют функцию thread_initiate, переданную в pthread_create?

+1

У вас нет контроля над тем, когда и как долго работает поток, поэтому ответ довольно неопределен. –

+1

'printf (" \ n% d% d \ n ", glob/20, glob)' Стоит отметить, что код ** не ** защищен от параллельного доступа при оценке 'glob'. И нет никакой инициирующей нить «функции». Я думаю, вы имеете в виду атрибуты инициализации потока *, предоставленные * optional * 'pthread_attr_t'. Это настройки/подсказки о том, как настроить поток при его создании. – WhozCraig

+0

Посредством thread_initiate я имею в виду start_routine, упомянутый здесь http://man7.org/linux/man-pages/man3/pthread_create.3.html – Deepak

ответ

0

Я понял, я не думал о коде должным образом. Нитки работают одновременно, поэтому нет способа решить, какой будет значение glob. Если два потока запущены, первый может быть 5 значений в цикле, а второй поток может быть 2 значениями, что будет означать, что значение glob равно 7. Когда glob напечатан, значение всегда будет больше, чем кратное 20 (для этой конкретной задачи).

Что касается второй части, я считаю, что начальная процедура - это код, который будет запускаться нить.

Благодаря @WhozCraig и @JoachimPileborg за помощь!