Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1687
  • Last Modified:

How can get the thread ids

hi,


In my unix program I am creating a series of threads inwhich i am executing different functions on creation of new thread.I want to have the track of all these thread ids of the individual threads.I should able to stop any one of the thread and all the remaining threads should be running.

here i am sending my code what i have done. In that I want to stop first thread and the second thread shold be running as usual.Please help me


[ccode]

#include<pthread.h>
#include<errno.h>
#include<stdio.h>

void do_loop(int *data)
{
      int i;
      int j;
      printf("I am in do_loop\n");

      for (i = 0;i<10;i++)
      {
            for(j=0;j<500000;j++)
            {
                  printf("%d got\n ",*data);
      
                  printf("\nMy  thread id  %d\n",pthread_self());
      
                  sleep(20);
            }

      }

      //pthread_exit(NULL);
}


void do_loop1(int *data)
{
      int i;
      int j;
      printf("I am in do_loop1\n");

            for (i = 0;i<10;i++)
            {
                  for(j=0;j<500000;j++)
                  {
                        
                  printf("%d got\n ",*data);                              printf("\nMy thread id   %d\n",pthread_self());
                                            sleep(20);
                                                            }
      
      }
}

int main(int argc,char *argv[])
{
//      int thread_id;
      pthread_t p_thread1;
      pthread_t p_thread2;
      int a=100;
      int b=111;
      int j;

       pthread_create(&p_thread1,pthread_attr_default,do_loop,&a);
      
       pthread_create(&p_thread2,pthread_attr_default,do_loop1,&b);

      sleep(10);
      for(j=0;j<500000;j++)
      {
            printf("I am in parent loop\n");
            printf("count j = %d",j);
            
            if(j==4)
                  pthread_cancel(pthread_self());

                         // here i want to cancel the specific thread

      //      pthread_cancel(p_thread1.pthread_id);
            sleep(20);
      }


      return 0;

}

[/ccode]

0
adinarayanak
Asked:
adinarayanak
  • 4
  • 3
1 Solution
 
adinarayanakAuthor Commented:
if  I put the sleep(20) before  second printf in any one of the do_loops then I am getting two different ids.but if i execute the prigram as it is given in the code,I am getting the same thread id for both.Why it is happening.
0
 
rdelfinoCommented:

1st - pthread_cancel() is enough to cancel (kill) a thread wich has its cancel
        state as PTHREAD_CANCEL_ENABLE (default state)

2nd - If you cancel the main thread, your process wil die (and all threads
         within it)

3rd - pthread_self() returns the current thread ID

4th - the program below creates 2 threads besides the main thread, and
        cancels the first thread created


-------------------8<----------------

#include<pthread.h>
#include<errno.h>
#include<stdio.h>
void do_loop(int *data)
{
  int i;
   int j;
   printf("I am in do_loop\n");

  for (i = 0;i<10;i++)
  {
     for(j=0;j<500000;j++)
     {
        printf("%d got\n ",*data);

        printf("\nMy  thread id  %d\n",pthread_self());

        sleep(20);
      }

  }

}


void do_loop1(int *data)
{
  int i;
  int j;
  printf("I am in do_loop1\n");
 
  for (i = 0;i<10;i++)
  {
     for(j=0;j<500000;j++)
     {
        printf("%d got\n ",*data);
        printf("\nMy thread id   %d\n",pthread_self());
        sleep(20);
      }

  }
}

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

  pthread_t p_thread1;
  pthread_t p_thread2;
  int a=100;
  int b=111;
  int j;

                        pthread_create(&p_thread1,pthread_attr_default,do_loop,&a);

                        pthread_create(&p_thread2,pthread_attr_default,do_loop1,&b);

  sleep(10);
  for(j=0;j<500000;j++)
  {
    printf("I am in parent loop\n");
    printf("count j = %d",j);


    if (j == 100);
    {
       // here you kill (cancel) the first thread you created from the
       // parent thread
       pthread_cancel(p_thread1);
       
       sleep(20);
       return 0;
    }

  }
  return 0;
}
0
 
adinarayanakAuthor Commented:
if i modify the same program as




                 #include<pthread.h>
                 #include<errno.h>
                 #include<stdio.h>
                 void do_loop(int *data)
                 {
                   int i;
                    int j;
                    printf("I am in do_loop\n");

                   for (i = 0;i<10;i++)
                   {
                      for(j=0;j<500000;j++)
                      {
                         printf("%d got\n ",*data);

                         printf("\nMy  thread id  %d\n",pthread_self());

                         sleep(20);
                       }

                   }

                 }


     

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

                   pthread_t p_thread1;
                   pthread_t p_thread2;
                   int a=100;
                   int b=111;
                   int j;

                                         pthread_create(&p_thread1,pthread_attr_default,do_loop,&a);

                                         pthread_create(&p_thread2,pthread_attr_default,do_loop,&b);


                   sleep(10);
                   for(j=0;j<500000;j++)
                   {
                     printf("I am in parent loop\n");
                     printf("count j = %d",j);


                     if (j == 100);
                     {
                        // here you kill (cancel) the first thread you created from the
                        // parent thread
                        pthread_cancel(p_thread1);
                         
                        sleep(20);
                        return 0;
                     }

                   }
                   return 0;
                 }




if i run this when the count j == 100 the program will be stopped.

I want one thread to be continuously executing and one thread to be terminated.

please do it
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
rdelfinoCommented:
When the main thread finishes, the process die (and all threads within it).

All you gotta do is  change the following lines

  if (j == 100);
  {
     // here you kill (cancel) the first thread you created from the
     // parent thread
     pthread_cancel(p_thread1);
                           
     sleep(20);
     return 0;
  }

to these ones below

  if (j == 100);
  {
     // here you kill (cancel) the first thread you created from the
     // parent thread
     pthread_cancel(p_thread1);
                           
     sleep(20);
     //return 0;
  }
0
 
adinarayanakAuthor Commented:
It is fine.Can I display  any one of the childrens' thread_id in the main loop.
If so how to do it.


waiting for u'r reply.

regards,
AdinarayanaK.
0
 
rdelfinoCommented:

in the main thread, do the following after you created the 2 threads:

printf("thread1 id = %u\n", p_thread1);
printf("thread2 id = %u\n", p_thread2);

0
 
adinarayanakAuthor Commented:
But it is giving the same id for both the threads.

Why it is so.

awaiting u'r reply.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now