PThread Create не създава нишка

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

FILE * f;
sem_t * s1;
sem_t * s2;
int check;
int  v1;
int  v2;
int i;

static void * client (void *arg){


    sem_getvalue(s1, &v1); printf("Client pre wait(S1) in S1 => S1 = %d\n",v1);
    sem_wait(s1);
    printf("client works...\n");
    check = sem_getvalue(s1, &v1); printf("Client.wait(S1) in S1 => S1 = %d\n",v1);
    if(check != 0) printf("sem_getvalue error");


     return 0;
    }


int main(void){

    pthread_t tidc;
    pthread_t tids;
    int rc;
    int rs;

    //Semaforo 1
    s1 = (sem_t *) malloc(sizeof(sem_t));
    check = sem_init (s1, 0, 2);
    if (check != 0) perror("s1_init failed");




    sem_getvalue(s1, &v1);

    printf("Create the semaphores: S1 = %i\n",v1 );

    sem_wait(s1);
    printf("main waits\n");
    sem_getvalue(s1, &v1); printf("Main.wait(S1) in S1 => S1 = %d\n",v1);

    rc = pthread_create (&tidc, NULL, client, 0);
    printf(" thread created ==> rc= %i\n",rc);


    return 0;

   }

Той връща този изход:

Create the semaphores: S1 = 2
main waits
Main.wait(S1) in S1 => S1 = 1
 thread created ==> rc= 0

И понякога това:

 Create the semaphores: S1 = 2
main waits
Main.wait(S1) in S1 => S1 = 1
 thread created ==> rc= 0
Client pre wait(S1) in S1 => S1 = 1
Client pre wait(S1) in S1 => S1 = 1
client works...
Client.wait(S1) in S1 => S1 = Client.wait(S1) in S1 => S1 = 0

Изглежда, че понякога създава две нишки, а понякога нито една. Компилирам с gcc prog.c -lpthred и дори с gcc -pthread prog.c


person Diego Zucca    schedule 18.03.2017    source източник
comment
Възможен дубликат на главната нишка излиза, другата излиза ли също?   -  person tofro    schedule 18.03.2017


Отговори (1)


Ако една многонишкова програма не прави едно и също нещо от едно изпълнение на друго, това може да се дължи на неинициализирани променливи (както в програми без нишки), но също така може да се дължи на условие за състезание.

В този случай условието за надпревара е между изпълнение на нишка и изход от програмата.

Тъй като излизате от основната си тема веднага след създаването на вашите нишки, нишките се прекратяват (main изход на нишка, излиза ли и друг?). Понякога нишката има време да направи нещо в зависимост от състоянието и натоварването на ОС.

Ако добавите някаква действителна обработка, дълго забавяне или извикване на pthread_join(tdic,NULL); за изчакване на прекратяване на нишката във вашата основна програма, ще имате детерминистично поведение.

person Jean-François Fabre    schedule 18.03.2017