创建线程:pthread_create

创建线程:pthread_create

大家好,又见面了,我是全栈君。

 

int pthread_create((pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
若线程创建成功,则返回0。若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的

 

int pthread_join(pthread_t thread, void **retval);
以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的

 

int pthread_detach(pthread_t tid);
调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此,比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的链接),这时可以在子线程中加入代码pthread_detach(pthread_self())或者父线程调用pthread_detach(thread_id)(非阻塞,可立即返回)

 

pthread_t pthread_self(void);
获得线程自身的ID。pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则显示结果出问题。

 

void pthread_exit(void* retval);
线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。

 

int pthread_cancel(pthread_t thread)
发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。
http://www.cnblogs.com/lijunamneg/archive/2013/01/25/2877211.html

 

int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
作用是初始化一个线程对象的属性,需要用pthread_attr_destroy函数对其去除初始化。
Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。

 

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
attr 是线程属性变量;stacksize 则是设置的堆栈大小。 返回值0,-1分别表示成功与失败。
堆栈最小值定义为 PTHREAD_STACK_MIN ,包含#include <limits.h>后可以通过打印其值查看。对于默认值可以通过pthread_attr_getstacksize (&attr, &stack_size); 打印stack_size来查看。

 

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
设置线程调度策略;POSIX 标准指定了三种调度策略:先入先出策略 (SCHED_FIFO)、循环策略 (SCHED_RR) 和自定义策略 (SCHED_OTHER)。SCHED_FIFO 是基于队列的调度程序,对于每个优先级都会使用不同的队列。SCHED_RR 与 FIFO 相似,不同的是前者的每个线程都有一个执行时间配额。SCHED_FIFO 和 SCHED_RR 是对 POSIX Realtime 的扩展。SCHED_OTHER 是缺省的调度策略。

 

int pthread_attr_setscope (pthread_attr_t* attr, int scope);
POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。

 

int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);
该表示新线程是否与进程中其他线程脱离同步,如果设置为PTHREAD_CREATE_DETACHED则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。

 

int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);
int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);
一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0

 

int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param)
用于设置线程的调用策略和优先级。

int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);
int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);

设置线程的继承属性,PTHREAD_INHERIT_SCHED: 新的线程继承创建线程的策略和参数;PTHREAD_EXPLICIT_SCHED:新的线程继承策略和参数显示指定。

 

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <string.h> #include <sys/syscall.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #ifndef T_DESC #define T_DESC(x, y) (y) #endif #if T_DESC("global", 1) pid_t gettid(void) { return syscall(SYS_gettid); } #endif #if T_DESC("TU1", 1) void thread_1(void) { int i; for(i=0; i<10; i++) { printf("thread_1: pid=0x%x tid=0x%x self=0x%x\n", getpid(), gettid(), (int)pthread_self()); sleep(1); } pthread_exit(0); } void thread_2(void) { int i; for(i=0; i<5; i++) { printf("thread_2: pid=0x%x tid=0x%x self=0x%x\n", getpid(), gettid(), (int)pthread_self()); sleep(1); } pthread_exit(0); } int tu1_proc(void) { pthread_t id_1,id_2; int ret; unsigned long stack_size; pthread_attr_t attr; struct sched_param sched; pthread_attr_init(&attr); sched.sched_priority = 80; //pthread_attr_setschedpolicy(&attr, SCHED_OTHER); pthread_attr_setschedpolicy(&attr, SCHED_FIFO); //pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); //会导致线程创建失败  pthread_attr_getstacksize(&attr, &stack_size); printf("default stack size is %ld(k)\n", stack_size/1024); printf("SCHED_FIFO: Max %u, Min %u\n", sched_get_priority_max(SCHED_FIFO), sched_get_priority_min(SCHED_FIFO)); printf("SCHED_RR: Max %u, Min %u\n", sched_get_priority_max(SCHED_RR), sched_get_priority_min(SCHED_RR)); printf("SCHED_OTHER: Max %u, Min %u\n", sched_get_priority_max(SCHED_OTHER), sched_get_priority_min(SCHED_OTHER)); ret = pthread_create(&id_1, &attr, (void *)thread_1, NULL); if(ret != 0) { printf("Create pthread error!\n"); return -1; } ret = pthread_create(&id_2, &attr, (void *)thread_2, NULL); if(ret != 0) { printf("Create pthread error!\n"); return -1; } printf("main: pid=0x%x tid=0x%x self=0x%x\n", getpid(), gettid(), (int)pthread_self()); /*等待线程结束*/ pthread_join(id_1, NULL); pthread_join(id_2, NULL); return 0; } #endif #if T_DESC("TU2", 1) #endif #if T_DESC("global", 1) void usage() { printf("\n Usage: <cmd> <tu>"); printf("\n 1 -- base case"); printf("\n 2 -- todo "); printf("\n"); } int main(int argc, char **argv) { int ret; if(argc < 2) { usage(); return 0; } int tu = atoi(argv[1]); if (tu == 1) ret = tu1_proc(); return ret; } #endif #if T_DESC("readme", 1) /* 1, compile command gcc -o thread.out pthread.c -lpthread */ #endif

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108577.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ntp时间同步协议_ntp服务器搭建

    ntp时间同步协议_ntp服务器搭建一、简介1.作用NTP是从时间协议(TimeProtocol)和ICMP时间戳报文(ICMPTimeStampMessage)演变而来,在准确性和健壮性方面进行了特殊的设计,理论上精度可达十亿分之一秒。NTP协议应用于分布式时间服务器和客户端之间,实现客户端和服务器的时间同步,从而使网络内所有设备的时钟基本保持一致。NTP协议是基于UDP进行传输的,使用端口号为123。2.特征NTP提供了准…

    2022年10月11日
  • 谷歌学术里面的代码查找不到_谷歌学术引用

    谷歌学术里面的代码查找不到_谷歌学术引用谷歌浏览器里面安装FindCodeforResearchPapers插件

    2022年10月11日
  • linux同时启动两个Tomcat[通俗易懂]

    linux同时启动两个Tomcat[通俗易懂]编辑环境变量:vim/etc/profile 在文件末尾复制粘贴即可##########firsttomcat###########CATALINA_BASE=/opt/tomcatCATALINA_HOME=/opt/tomcatTOMCAT_HOME=/opt/tomcatexportCATALINA_BASECATALINA_HOMETOMCAT_HO

  • centos6.5防火墙关闭命令(cmd关闭防火墙)

    cmd命令关闭防火墙netstopmpssvc CentOS6关闭防火墙使用以下命令,//临时关闭serviceiptablesstop//禁止开机启动chkconfigiptablesoffCentOS7中若使用同样的命令会报错,stop iptables.serviceFailedtostopiptables.service:Unitipt…

  • pycharm快捷键和常规设置[通俗易懂]

    pycharm快捷键和常规设置[通俗易懂]记录下我常用的pycharm快捷键和设置(Windows10)1、更换背景:文件—设置—-外观与行为—外观—背景图像本来是没想到设置背景图像的。脑子一抽换了一个,感觉发现了新大陆。(程序员鼓励师)2、列模式Alt+Shift+鼠标左键可以批量选中并修改3、Ctrl+E打开最近文件。多用于打开了多个文件时快速定位。也可以在tab标签里找,不过tab打开多了就会挤压之前标签,看起来特别费劲。4、Ctrl+B快速定位变量在哪定义的快速定位函数定义代码5、Shift+Enter

  • Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener「建议收藏」

    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener「建议收藏」 前言  本章内容是android.widget.CompoundButton.OnCheckedChangeListener,翻译来自德罗德,再次感谢德罗德!期待你一起参与AndroidAPI的中文翻译,联系我over140@gmail.com。 声明  欢迎转载,但请保留文章原始出处:)    博客园:http://www.cnblogs.com/    Android中文翻…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号