Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

How can get the thread ids

Posted on 2000-02-25
7
Medium Priority
?
1,685 Views
Last Modified: 2013-12-26
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
Comment
Question by:adinarayanak
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
7 Comments
 

Author Comment

by:adinarayanak
ID: 2558710
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
 
LVL 2

Accepted Solution

by:
rdelfino earned 30 total points
ID: 2559803

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
 

Author Comment

by:adinarayanak
ID: 2564477
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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 2

Expert Comment

by:rdelfino
ID: 2564819
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
 

Author Comment

by:adinarayanak
ID: 2564965
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
 
LVL 2

Expert Comment

by:rdelfino
ID: 2564997

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
 

Author Comment

by:adinarayanak
ID: 2565211
But it is giving the same id for both the threads.

Why it is so.

awaiting u'r reply.
0

Featured Post

New benefit for Premium Members - Upgrade now!

Ready to get started with anonymous questions today? It's easy! Learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
Introduction: Database storage, where is the exe actually on the disc? Playing a game selected randomly (how to generate random numbers).  Error trapping with try..catch to help the code run even if something goes wrong. Continuing from the seve…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
Suggested Courses

661 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question