pthread_detach - put a running thread in the detached state
#include <pthread.h>
int
pthread_detach(pthread_t
th);
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.
On success, 0 is returned. On error, a non-zero error code is returned.
- 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);
}