pthread_tpthread_join的介绍
pthread_t 时间:2021-06-13 阅读:(
)
C语言多线程的操作步骤
线程创建
函数原型:intpthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立线程返回0,否则返回错误的编号。
形式参数:pthread_t*restrict tidp要创建的线程的线程id指针;const pthread_attr_t *restrict attr创建线程时的线程属性;void *(start_rtn)(void)返回值是void类型的指针函数;void *restrict arg start_rtn的形参。
线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。
也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然后程序才会断续执行。
函数原型:intpthread_join(pthread_tthread, void **value_ptr);
参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。
返回值:若成功,则返回0;若失败,则返回错误号。
线程退出
函数原型:voidpthread_exit(void *rval_ptr);
获取当前线程id
函数原型:pthread_tpthread_self(void);
互斥锁
创建pthread_mutex_init;销毁pthread_mutex_destroy;加锁pthread_mutex_lock;解锁pthread_mutex_unlock。
条件锁
创建pthread_cond_init;销毁pthread_cond_destroy;触发pthread_cond_signal;广播pthread_cond_broadcast;等待pthread_cond_wait。
pthread函数怎么用求解
.关于编译时出现 对‘pthread_create’未定义的引用 之类的错误的解决:由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:
-o pthread -lpthread pthread.c
特别的,如果这样还没解决的话:
按照上面编译了一下,还是一样的提示.
后面man
才知道Usage: [options] file...
因此需要将库链接放在末尾。
xs@vm:~/$ -o pthread pthread.c -lpthread
2.关于pthread里的一些函数.
pthread_join函数:
函数pthread_join用来等待一个线程的结束。
函数定义: int pthread_join(pthread_t thread, void **al);
描述 :
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。
当函数返回时,被等待线程的资源被收回。
如果进程已经结束,那么该函数会立即返回。
并且thread指定的线程必须是joinable的。
参数 :
thread: 线程标识符,即线程ID,标识唯一线程。
al: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。
失败,返回的则是错误号。
看下面一段程序:
[cpp] view plain copy print?
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
void *thread(void *str)
{
int i;
for (i = 0; i < 10; ++i)
{
sleep(2);
printf( "This in the thread : %d
" , i );
}
return NULL;
}
int main()
{
pthread_t pth;
int i;
int ret = pthread_create(&pth, NULL, thread, (void *)(i));
pthread_join(pth, NULL);
for (i = 0; i < 10; ++i)
{
sleep(1);
printf( "This in the main : %d
" , i );
}
return 0;
}
也就是说:子线程还没有执行完毕,main函数已经退出,那么子线程也就退出了!
如果我们不注释掉那一行,那么运行结果如下:
这说明:pthread_join函数的调用者在等待子线程退出后才继续执行!
pthread_create函数:
声明:
int pthread_create(pthread_t *thread,
const pthread_attr_t *restrict_attr,
void*(*start_rtn)(void*),
void *restrict arg);
参数:
第一个参数*thread为指向线程标识符的指针。
第二个参数*restrict_attr用来设置线程属性,上面也可以用NULL,表示使用默认的属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数,NULL表示无参数。
另外,在编译时注意加上-lpthread参数,以调用链接库。
因为pthread并非Linux系统的默认库,而是posix线程库,在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显示的链接该库。
函数在执行错误时的错误信息将作为返回值返回,并不修改系统全局变量errno,当然也无法使用perror()打印错误信息。
pthread_t:pthread_t用于声明线程ID!
类型定义:
typedef unsigned long int pthread_t;
/e from /usr/include/bits/pthread.h
sizeof (pthread_t) =4;
pthread_attr_init函数:
声明:int pthread_attr_init(pthread_attr_t*attr);
返回值:返回0,表示函数初始化对象成功。
失败时返回一个错误代码。
参数:指向一个线程属性的指针。
下面一个程序是书上的:
[cpp] view plain copy print?
/*小小的一个程序,折腾人个半死*/
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
int sum;
void *runner (void *param);
int main(int argc, char *argv[])
{
pthread_t tid;/*线程标示符*/
pthread_attr_t attr;
if (argc != 2)/*如果参数不为2个*/
{
fprintf (stderr, "usage:a.out<integer value>
");/*报错*/
return -1;
}
if (atoi(argv[1] ) < 0)
{
fprintf (stderr, "%d must be <= 0
", atoi(argv[1]));
return -1;
}
pthread_attr_init(&attr); /*初始化,得到默认的属性值*/
pthread_create(&tid, &attr, runner, argv[1]);/*创建一个线程*/
pthread_join(tid, NULL);/*等待子线程执行完毕*/
printf ("sum = %d
", sum);
return 0;
}
void *runner(void *param)/*子线程将会执行这个函数*/
{
int i, upper = atoi(param);
sum = 0;
for (i = 1; i <= upper; i++)
{
sum += i;
}
pthread_exit(0);
}pthread_join的介绍
函数pthread_join用来等待一个线程的结束。
头文件 : #include <pthread.h>函数定义: int pthread_join(pthread_t thread, void **al);描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。
当函数返回时,被等待线程的资源被收回。
如果线程已经结束,那么该函数会立即返回。
并且thread指定的线程必须是joinable的。
参数 :thread: 线程标识符,即线程ID,标识唯一线程。
al: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。
失败,返回的则是错误号。
公司介绍成都随风云科技有限公司成立于2021年,是国内领先的互联网业务平台服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、双线高防、香港等优质的IDC资源。公司一直秉承”以人为本、客户为尊、永续创新&...
提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...
ATCLOUD.NET怎么样?ATCLOUD.NET主要提供KVM架构的VPS产品、LXC容器化产品、权威DNS智能解析、域名注册、SSL证书等海外网站建设服务。 其大部分数据中心是由OVH机房提供,其节点包括美国(俄勒冈、弗吉尼亚)、加拿大、英国、法国、德国以及新加坡。 提供超过480Gbps的DDoS高防保护,杜绝DDoS攻击骚扰,比较适合海外建站等业务。官方网站:点击访问ATCLOUD官网活...
pthread_t为你推荐
virusscan为什么解压文件显示VirusScan 警报!不能解压!怎么回事怎么解决高手来y码男生衣服M L XL分别是什么码?seo优化技术什么是SEO优化,seo优化有什么用?小四号字word里的小四号字在Photoshop里是指多少点字体?star413匡威jack star 的后标是不是真的?如图assemblyinfocsgo很跟cs有什么区别什么是生态系统生态系统的我主要特征是什么?腾讯贴吧QQ贴吧如何发帖点心os什么是点心os?手机操作系统和手机区别么?一个是硬件一个是软件?听说炒的好火?红牛下架红牛下架事件怎么回事?美宜佳最近怎么买不到红牛了?
l5639 网络星期一 日本空间 本网站服务器在美国 日本bb瘦 softbank邮箱 新家坡 网站卫士 免费高速空间 如何安装服务器系统 香港新世界中心 联通网站 西安服务器托管 美国凤凰城 贵阳电信测速 酸酸乳 免费网络空间 如何登陆阿里云邮箱 杭州电信 乐视会员免费领取 更多