Solved

How can get the thread ids

Posted on 2000-02-25
7
1,679 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 10 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
Database Solutions Engineer FAQs

In this series, we will discuss common questions received as a database Solutions Engineer at Percona. In this role, we speak with a wide array of MySQL and MongoDB users responsible for both extremely large and complex environments to smaller single-server environments.

 
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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

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.

Question has a verified solution.

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

Introduction: Load and Save to file, Document-View interaction inside the SDI. Continuing from the second article about sudoku.   Open the project in visual studio. From the class view select CSudokuDoc and double click to open the header …
Introduction: Dialogs (1) modal - maintaining the database. Continuing from the ninth article about sudoku.   You might have heard of modal and modeless dialogs.  Here with this Sudoku application will we use one of each type: a modal dialog …
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.
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
Suggested Courses

615 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