关于pthread_join函数在使用时如何不阻塞主线程的一种探索

pthread_join 函数是会阻塞主线程的,这会让很多java程序员不适应。因为在java中
start以后一个线程就执行执行了。主线程不会被阻塞。

而在linux中 join是会阻塞的。

那么如何使用join的时候 不阻塞主线程呢。我给出了一个解决方法。


#include <stdio.h>
#include <pthread.h>
void *print_count(int c);

void thread_start();

int main(int argc, char const *argv[])
{

pthread_t t1;

pthread_create(&t1,NULL,thread_start,NULL);

printf("start main\n");

sleep(3);

printf("done main\n");

return 0;
}

void thread_start()
{
pthread_t t1;

pthread_create(&t1,NULL,print_count,3);

pthread_join(t1,NULL);

}

void *print_count(int c)
{

int i;

for (i = 0; i < c; ++i)
{
/* code */
printf("i == %d\n", i);
}

}

关于pthread_join函数在使用时如何不阻塞主线程的一种探索,布布扣,bubuko.com

时间: 2024-10-10 02:39:10

关于pthread_join函数在使用时如何不阻塞主线程的一种探索的相关文章

对于新手,某些可变参数函数在使用时,可能会出现的问题

在学习进程操作测试linux exec函数时,写了非常简单的一段测试代码,如下: 在用gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 编译时,提示一下问题: 后来,与一本参考书进行比对,也没有发现错误(可能GCC版本不一样),后来查找了一下其它资料,发现问题:对于一些参数为变长数组的函数,必须在参数末尾加上 NULL 值,来表明传递的参数结束.例如这里的execl格式(exec的一种形式,其总共有六种表达形式). 对于有可变参数数组的函数,可能出

time.h文件中包含的几个函数使用时须注意事项

time.h头文件中包含以下函数 char* asctime(const struct tm *tm); char* asctime_r(const struct tm *tm,char *buf); char* ctime(const time_t *timep); char* ctime_r(const time_t *timep,char *buf); struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const tim

pthread_join函数

函数简介 函数pthread_join用来等待一个线程的结束.函数原型为: extern int pthread_join (pthread_t__th, void **__thread_return); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值.这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回.如果执行成功,将返回0,如果失败则返回一个错误号. linux中的应用 在Linu

实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 1

公司当年有一个自己缓存集群用户session的Java library,是基于hazlcast2.0.3实现的,最近在customer site集群环境中某个blade报了Out of Memory Exception, 其他blades都正常,马上用jrockit jrcmd命令dump了堆和线程进行分析. printf "##################### heap ##################\n" su -p occas -c "/opt/jrocki

实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 2

hazelcast 提供了3中方法调用startCleanup: 第一种是在ConcuurentMapManager的构造函数中,通过调用node的executorManager中的ScheduledExecutorService来创建每秒执行一次cleanup操作的线程(代码如下).由于这是ConcuurentMapManager构造函数的代码,所以这种调用startCleanup的操作是默认就会有的. node.executorManager.getScheduledExecutorServ

protobuf在使用时出现的问题小汇总

文章开头放一下IBM的google protocol buffer的介绍链接.http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ 对于这种技术不断更新的东西,我只能这么理解:因为技术在更新,版本在变化,之前很详尽的技术博文可能在之后的版本中遇到无法预知的问题,所以我们在使用时要注意甄别.废话不多说,进入正文部分. 安装什么的都是小问题了,还是贴一下步骤吧. tar -xzf protobuf-2.5.0.tar.gz cd protobuf-

fstream对象重复使用时注意clear()的调用

fstream对象重复使用时注意clear()的调用,否则会造成打开第二个文件失败.这是因为一个fstream对象对应磁盘上的一个文件,这种绑定关系在调用open()函数或者构造函数时指定,但有时我们会重复使用同一个fstream对象先后绑定不同文件,在两次绑定中间仅仅调用close()是不够的(当然对close()的调用是必须的,每次打开文件使用完毕都必须关闭文件),因为close()函数并不会重置fstream的条件状态,如果先前的某个操作失败了,那么failbit的状态会一直保留下来,接下

C++ NULL 与 空字符串 在使用时的注意点

在这不做 理论上的 释疑,只是提供示例代码 int main() { char *p=NULL; if (p==NULL) // { p="p is NULL pointer"; } printf("%s\n",p); return 0; } //此处说明:在定义 指针p的同时使用 NULL 对p进行初始化,若是在比较的时候用 p[0] == '\0' 则会报错//   原因是 p不指向任何变量,对p进行[]操作非法//   变量所指的范围 包括 普通的内置变量,自

pow,sqrt使用时需注意

使用时注意类型,可见两者皆不可以用int 1.pow 函数声明: double pow (double base , double exponent); float pow (float base , float exponent); long double pow (long double base, long double exponent); double pow (double base , int exponent); long double pow (long double base