pramod kumar
pramod kumar

Reputation: 41

How to destroy thread in c linux

I need a thread that will call continuously in while(1), but when i use to call thread function by pthread_create() a new thread creates.
I need help on following points :~
1) Is there any method to call thread function without creating thread.
2) Is there any method to destroy the previous thread.

Sample code is

void main()
{
pthread_t thread1;
 while(1)
 {
        pthread_create( &thread1, NULL, myFun,  (void*) NULL);
 }
}
void * myFun(void *ptr)
{
printf("Hello");
}


* We can not create more than 380 threads, Here we have to use only single thread.

Upvotes: 2

Views: 23868

Answers (4)

pramod kumar
pramod kumar

Reputation: 41

Thanks to all for quick reply..
Problem has been fixed by using following code.

setsockopt (socket_desc, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout));


Here i set the timeout for accept the tcp clients request in microseconds.. now code is working OK.

Upvotes: 0

elson2885150
elson2885150

Reputation: 86

um, I think what you really want to do is like that:

bool received_data = false;
bool beExit = false;    
struct recvPacket;

pthread_mutex_t recvMutex;

void main()
{
    pthread_t thread1;
    void *status;

    pthread_mutex_init(&recvMutex, NULL);
    pthread_create(&thread1, NULL, myFun,  (void*) NULL);        

    while(1)
    {
        if (received_data) {
           pthread_mutex_lock(&recvMutex);             // you should also synchronize received_data and beExit valuables, cuz they are shared by two threads
           /* do what you want with recvPacket */
           pthread_mutex_unlock(&recvMutex);

           received_data == false;
        }

        /* do else you want, or you can let beExit = true to stop the thread */
    }

    if (err = pthread_join(thr_main, &status))
      printf("pthread_join Error. %s\n", strerror(err)), exit(1);
}

void * myFun(void *ptr)
{
    while (!beExit) {
        if (true == tryRecvPacket()) {
           pthread_mutex_lock(&recvMutex);
           /* fill data to recvPacket */
           pthread_mutex_unlock(&recvMutex);
           received_data = true;
        }
    }
}

Upvotes: 1

ajay_t
ajay_t

Reputation: 2385

For destroying the thread, you can use pthread_kill function available

int pthread_kill(pthread_t thread, int sig);

But its not good practice to kill the thread forcefully as it might cause the problem of the memory leak.

When the parent thread is finished, then all the child threads are finished abruptly. In your example, as child thread will be in the infinite loop so child thread never finishes. But parent thread-main thread will finish after executing the return 0 statement. So main thread will terminate the child thread also.

To overcome this situation i.e. wait until all child threads have finished, pthread_join(thread1) method is there. So the thread calling this function will wait unless thread1 has finished.

Upvotes: 0

Jeyaram
Jeyaram

Reputation: 9474

Suggested design is.

void * myFun(void *ptr);

volatile int thread_exit = 1; 

void main()
{
        pthread_t thread1;

        pthread_create( &thread1, NULL, myFun,  (void*) NULL);       

        while(1)
        {
             //Ask every 10 sec for killing thread like
             sleep(10);
             printf("Do you wish to kill [0/1]???");
             scanf("%d", &thread_exit); 
        } 


        //Add code here to make main() to wait till thread dies. 
        //pthread_join(&thread1);
}

void * myFun(void *ptr)
{
  while(thread_exit)
  {
     printf("Hello");
  }
}

Upvotes: 0

Related Questions