test pthread_cleanup_push、pthread_cleanup_pop and pthread_exit

原创 2012年03月28日 19:02:38

/****************************************************************************/
 * Author  : Samson
 * Date    : 03/28/2012
 * Test platform:
 *               GNU Linux version 2.6.29.4
 *               gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)

 * Description:

 *This program is the details of the interaction between the test           *pthread_cleanup_push, pthread_cleanup_pop and pthread_exit method function

/****************************************************************************/


#include <pthread.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define handle_error_en(en, msg) \
       do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static int cleanup_pop_arg = 0;
static int cnt = 0;

static void
cleanup_handler (void *arg)
{
   char *str = (char *)arg;

   printf ("Called clean-up handler, arg is %s\n", str);
   cnt = 0;
}

static void *
thread_start (void *arg)
{
   time_t start, curr;
   char *str;
   char strr[64] = {0};

   str = malloc (64);
   printf ("New thread started\n");
   sprintf (strr, "pusharg\n");
   //call pthread_cleanup_push register clean function that when called
   //pthread_exit or pthread_cancel function or when pthread_cleanup_pop arg is non-zero.
   pthread_cleanup_push (cleanup_handler, strr);

   curr = start = time (NULL);
   sprintf (str, "this thread: %d called pthread_exit\n", (int) pthread_self());
   pthread_exit (str);
   //if pthread_cleanup_pop arg is non-zero, execute clean function and pop clean function.
   //else only pop register clean function.
   pthread_cleanup_pop (cleanup_pop_arg);
   return NULL;
}

int
main (int argc, char *argv[])
{
   pthread_t thr;
   int s;
   void *res, *ret;

   if (argc > 1)
   {
    //argv[1]  is set pthread_cleanup_pop arg
       cleanup_pop_arg = atoi (argv[1]);
   }

   s = pthread_create (&thr, NULL, thread_start, NULL);
   if (s != 0)
       handle_error_en (s, "pthread_create");

   sleep (2);           

   s = pthread_join (thr, &res);
   if (s != 0)
   {
       handle_error_en (s, "pthread_join");
   }
   else
   {
       printf ("pthread_join velret is %s\n", (char *) res);
   }
   if (res == PTHREAD_CANCELED)
   {
       printf ("Thread was canceled; cnt = %d\n", cnt);
   }
   else
   {
       printf ("Thread terminated normally; cnt = %d\n", cnt);
   }
   exit (EXIT_SUCCESS);
}

compile and run:
# ./a.out
New thread started
Called clean-up handler, arg is pusharg

pthread_join velret is this thread: -1207649424 called pthread_exit

Thread terminated normally; cnt = 0

when Comment out that line of code contains pthread_exit compile and run the results as follows:
# ./a.out
New thread started
pthread_join velret is (null)
Thread terminated normally; cnt = 0

//when run with arg 1 to change pthread_cleanup_pop arg result as follows:
# ./a.out 1
New thread started
Called clean-up handler, arg is pusharg

pthread_join velret is (null)
Thread terminated normally; cnt = 0


pthread_exit-----在linux主线程中的用途

大家都知道在一个线程中调用pthread_exit表示退出一个线程,并且pthread_exit的参数作为返回值提供给pthread_join函数获取。 那么如果在main函数创建了若干个线程后,在...
  • jackywgw
  • jackywgw
  • 2017年06月27日 17:18
  • 323

用pthread_exit函数时注意的问题

今天看到这个函数,原来它的内部也有不为人知的内涵。 原型: #include void pthread_exit(void *rval_ptr); 参数是个空类型的指针,其实关...
  • dl0914791011
  • dl0914791011
  • 2014年04月15日 15:49
  • 1287

多线程:线程的返回retrun和pthread_exit

/***************************************************************************************************...
  • kangear
  • kangear
  • 2013年01月18日 10:21
  • 5352

Linux pthread_exit及线程清理函数

pthread_exit 关于线程的终止 单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。 (1)线程只是从例程中返回,返回线程的退出码。 (2)线程可以被同...
  • CSLQM
  • CSLQM
  • 2016年11月20日 09:11
  • 2736

关于线程加了锁未解锁和pthread_cleanup_push函数遇到的问题

关于线程加了锁未解锁和pthread_cleanup_push函数遇到的问题
  • lyh__521
  • lyh__521
  • 2014年07月30日 20:26
  • 822

iOS多线程编程指南(二)线程管理

当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体。每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片。一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何...
  • chaoyuan899
  • chaoyuan899
  • 2015年03月11日 21:55
  • 575

linux下pthread_exit在主线程中的用途

pthread_exit在main中有只终止main线程,而不终止整个进程的作用(注意不存在父子线程的概念),下面是posix中关于pthread_exit的一段描述: When you progra...
  • xhu_eternalcc
  • xhu_eternalcc
  • 2013年10月11日 20:46
  • 1540

汇编test和cmp区别

汇编test和cmp区别 看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚. 首先看看:...
  • thanklife
  • thanklife
  • 2013年09月04日 15:57
  • 6499

go test 命令介绍

go testgo test是go语言自带的测试工具,其中包含的是两类,单元测试和性能测试 通过go help test可以看到go test的使用说明: 格式形如: go test [-c] ...
  • csapr1987
  • csapr1987
  • 2015年04月08日 12:21
  • 2028

java中 @Test注解的使用和其他成员

package com.starry.exersice; import org.junit.After; import org.junit.AfterClass; import org.junit....
  • starry7953810
  • starry7953810
  • 2017年06月12日 19:04
  • 360
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:test pthread_cleanup_push、pthread_cleanup_pop and pthread_exit
举报原因:
原因补充:

(最多只允许输入30个字)