Showing posts with label pthread_detach example. Show all posts
Showing posts with label pthread_detach example. Show all posts

Wednesday, April 24, 2013

pthread_detach example c c++


NAME
     pthread_detach -- detach a thread

SYNOPSIS
     #include <pthread.h>

     int
     pthread_detach(pthread_t thread);

DESCRIPTION
     The pthread_detach() function is used to indicate to the implementation that storage for the thread
     thread can be reclaimed when the thread terminates.  If thread has not terminated, pthread_detach()
     will not cause it to terminate.  The effect of multiple pthread_detach() calls on the same target
     thread is unspecified.

RETURN VALUES
     If successful,  the pthread_detach() function will return zero.  Otherwise, an error number will be
     returned to indicate the error.  Note that the function does not change the value of errno, as it did
     for some drafts of the standard.  These early drafts also passed a pointer to pthread_t as the argu-
     ment.  Beware!

ERRORS
     pthread_detach() will fail if:

     [EINVAL]           The implementation has detected that the value specified by thread does not refer to
                        a joinable thread.

     [ESRCH]            No thread could be found corresponding to that specified by the given thread ID,
                        thread.

SEE ALSO
     pthread_join(3)

STANDARDS
     pthread_detach() conforms to ISO/IEC 9945-1:1996 (``POSIX.1'').

Example of pthread_detach

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void *t_function(void *data)
{
    char a[100000];
    int num = *((int *)data);
 printf("Thread Start\n");
    sleep(5);
 printf("Thread end\n");
}

int main()
{
    pthread_t p_thread;
    int thr_id;
    int status;
    int a = 100;

 printf("Before Thread\n"); 
    thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a);
    if (thr_id < 0)
    {
        perror("thread create error : ");
        exit(0);
    }
 

    pthread_detach(p_thread);
    pause();
    return 0;
}

Wednesday, May 4, 2011

pthread_detach example c c++

Name

pthread_detach - put a running thread in the detached state

Synopsis

#include <pthread.h>
int pthread_detach(pthread_t th);

Description

pthread_detach puts the thread th in the detached state. This guarantees that the resources consumed by thwill be freed immediately when th terminates. However, this prevents other threads from synchronizing on the termination of th using pthread_join. If, when pthread_detach is called, th has already terminated, all of th's remaining resources will be freed.
A thread can be created initially in the detached state, using the detachstate attribute to pthread_create(3) . In contrast, pthread_detach applies to threads created in the joinable state, and which need to be put in the detached state later.
After pthread_detach completes, subsequent attempts to perform pthread_join on th will fail. If another thread is already joining the thread th at the time pthread_detach is called, th will be detached and pthread_join will eventually return when th terminates but may not return with th's correct return code.

Return Value

On success, 0 is returned. On error, a non-zero error code is returned.

Errors

ESRCH
No thread could be found corresponding to that specified by th
EINVAL
the thread th is already in the detached state
 
#include <stdio.h> 
#include <string.h> 
#include <pthread.h> 
 
pthread_t threads[5]; 
int done[5]; 
 
void *thread_main(void *); 
 
int main(void) 
{ 
    int i; 
    int rc; 
    int status; 
     
    printf("pid=%d\n", getpid()); 
 
    for (i = 0; i < 5; i++) 
    {     
        done[i] = 0; 
        pthread_create(&threads[i], NULL, &thread_main, (void *)i); 
        printf("%d, %d\n", i, threads[i]); 
    } 
 
    for (i = 4; i >= 0; i--) 
    { 
        done[i] = 1; 
        rc = pthread_join(threads[i], (void **)&status); /* detach thead에서는 사용할 필요 없다. */ 
        if (rc == 0) 
        { 
            printf("Completed join with thread %d status= %d\n",i, status); 
        } 
        else 
        { 
            printf("ERROR; return code from pthread_join() is %d, thread %d\n", rc, i); 
                 return -1; 
        } 
    } 
 
    return 0; 
} 
 
void *thread_main(void *arg) 
{ 
    int i; 
    double result=0.0; 
 
    pthread_detach(pthread_self()); /* 쓰레드 분리 */ 
 
    printf("therad: %d, %d\n", (int)arg, getpid()); 
 
    while (!done[(int)arg]) 
    { 
            for (i=0; i < 1000000; i++) 
           { 
                 result = result + (double)random(); 
           } 
           printf("thread: %d, result = %e\n", (int)arg, result); 
    } 
 
    pthread_exit((void *) 0); 
}