Question

A thread which is joined to another can't continue its execution untill the thread to which it is joined has been completely executed or terminated.

Following the above mentioned thread characteristics, the last thread I create in the following code must also print its statements inside the procedure Func() but it is not. Why is that?

Second, I am unable to set priority for any thread I create in this program. Am I missing something?

Here is the code:

void *Func(void *arg);
int main()
{
    pthread_t tid[5];

    pthread_attr_t *tattr;
    struct sched_param param;
    int pr,error,i;

    do
    {
        if( (tattr=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)) )==NULL)
        {
            printf("Couldn't allocate memory for attribute object\n");
        }
    } while(tattr==NULL);

    if(error=pthread_attr_init(tattr))
    {
        printf(stderr,"Attribute initialization failed with error %s\n",strerror(error));
    }

    for(i=0;i<5;i++)
    {
        scanf("%d",&pr);

        param.sched_priority=pr;
        error=pthread_attr_setschedparam(tattr,&param);

        if(error!=0)
        {
            printf("failed to set priority\n");
        }

        if(i%2==0)
        {
            if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_DETACHED))
            {
                fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error));
            }
        }
        else if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_JOINABLE))
        {
            fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error));
        }

        pthread_create(&tid[i],tattr,Func,tattr);

        pthread_join(tid[i],NULL);
        printf("waiting for thread %d\n",i);
    }

    free(tattr);

    printf("All threads terminated\n");
    return 0;
}

void *Func(void *arg)
{
    pthread_attr_t *tattr=(pthread_attr_t *)arg;
    int state,error;

    struct sched_param param;

    error=pthread_attr_getdetachstate(tattr,&state);

    if(error==0 && state==PTHREAD_CREATE_DETACHED)
    {
        printf(" My state is DETACHED\n");
    }
    else if(error==0 && state==PTHREAD_CREATE_JOINABLE)
    {
        printf(" My state is JOINABLE\n");
    }

    error=pthread_attr_getschedpolicy(tattr,&param);

    if(error==0)
    {
        printf(" My Priority is %d\n",param.sched_priority);
    }

    return NULL;
}
Was it helpful?

Solution

What is your operating system?

The meaning of the members of struct sched_param is implementation defined for scheduling policy SCHED_OTHER.

For example, on GNU/Linux, unless the scheduling policy is SCHED_RR or SCHED_FIFO, the sched_priority member is not used and must be set to 0.

Other than that, the fifth thread (the last) also prints its state and priority.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top