Pthread_cleanup_pop with argument 0?

I am studying the flow in the book APUE 2e

I thought the pthread_cleanup_pop functions are for setting the pthread_cleanup_push () push function to execute or not. Therefore, if the argument is zero, it is not executed and is not zero, it is executed.

But I looked at the code in Figure 11.5 in APUE. It...

#include "apue.h"
#include <pthread.h>

void
cleanup(void *arg)
{
    printf("cleanup: %s\n", (char *)arg);
}

void *
thr_fn1(void *arg)
{
    printf("thread 1 start\n");
    pthread_cleanup_push(cleanup, "thread 1 first handler");
    pthread_cleanup_push(cleanup, "thread 1 second handler");
    printf("thread 1 push complete\n");
    if (arg)
        return((void *)1);
    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
    return((void *)1);
}

void *
thr_fn2(void *arg)
{
    printf("thread 2 start\n");
    pthread_cleanup_push(cleanup, "thread 2 first handler");
    pthread_cleanup_push(cleanup, "thread 2 second handler");
    printf("thread 2 push complete\n");
    if (arg)
        pthread_exit((void *)2);
    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
    pthread_exit((void *)2);
}

int
main(void)
{
    int         err;
    pthread_t   tid1, tid2;
    void        *tret;

    err = pthread_create(&tid1, NULL, thr_fn1, (void *)1);
    if (err != 0)
        err_quit("can't create thread 1: %s\n", strerror(err));
    err = pthread_create(&tid2, NULL, thr_fn2, (void *)1);
    if (err != 0)
        err_quit("can't create thread 2: %s\n", strerror(err));
    err = pthread_join(tid1, &tret);
    if (err != 0)
        err_quit("can't join with thread 1: %s\n", strerror(err));
    printf("thread 1 exit code %d\n", (int)tret);
    err = pthread_join(tid2, &tret);
    if (err != 0)
        err_quit("can't join with thread 2: %s\n", strerror(err));
    printf("thread 2 exit code %d\n", (int)tret);
    exit(0);
}

      

in this program, although the pop functions have zero as an argument, the popped functions are subtracted ("first handler for stream 2", "second handler for stream 2" are printed by the cleanup function)

Why does pop work even if you put the argument 0?

I got pthread_cleanup_pop wrong ??

+3


source to share


1 answer


Did I get pthread_cleanup_pop wrong?

No, you didn't.

The reason your code executes cleanup handlers is because your control never reaches pthread_cleanup_pop(0)

. Instead, you always execute return

in thr_fn1

and pthread_exit

out thr_fn2

.



Try creating streams with pthread_create(&tid1, NULL, thr_fn1, (void *)0);

instead 1

. When I do this I get (expected):

thread 1 start
thread 1 push complete
thread 2 start
thread 2 push complete
thread 1 exit code 1
thread 2 exit code 2

      

+5


source







All Articles