用户态API(pthread)

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)
用于设置线程的调用策略和优先级。

注:
1、头文件
#include <pthread.h>
2、编译
pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在线程函数在编译时,需要连接库函数,如上图 gcc xx.c -lpthread

时间: 2024-10-10 14:02:22

用户态API(pthread)的相关文章

用户态API(pthread_mutex)

#include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex_init (pthread_mutex_t *mutex , pthread_mutexattr_t * attr );int pthread_mutex_destroy (pthread_mutex_t *mutex ); int pthread_mutexattr_destroy(pthread_mutexattr

用户态API(信号)

http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html #include <signal.h> typedef void (*sighandler_t)(int):sighandler_t signal(int signum, sighandler_t handler)); int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact))

用户态API(semaphore)

参考文档:http://blog.csdn.net/evsqiezi/article/details/8061176头文件:#include<semaphore.h> int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));sem为指向信号量结构的一个指针:pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享:value给出了信号量的初始值. int sem_post(sem_t *s

从pthread中获得tid及pthread_mutex_unlock本身用户态互斥

一.pthread结构中获取tid 这个问题是由于很多时候我们都是通过gettid来获得一个线程的tid,其实这个是一个非常简单的系统调用,但是即使它非常简单,我们还是要执行进行系统调用而引入的寄存器保存/恢复等操作.但是,在C库的pthread库的实现过程中,我们可以看到,用户态是肯定保存了一个线程的tid的,如果我们能够通过用户态这个一定会存在的pthread结构来获得这个tid,就可以避免大量的系统调用,从而为系统的效率提供方便. 1.C库实现方法 __pthread_create_2_0

操作系统--用户空间和内核空间,用户态和内核态

内核空间和用户空间,内核态和用户态(转载) 内核空间和用户空间Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0-4G.Linux内核将这4G字节的空间分为两部分.将最高的1G字节(从虚拟地址 0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”.而将较低的 3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间).因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有

170322计算机硬件介绍&amp;&amp;时钟&amp;&amp;中断&amp;&amp;内核态、用户态与系统功能调用&amp;&amp;操作系统分类

一.冯诺依曼计算机 1.1 对第一台电脑提出: (1)二进制代替十进制: (2)程序与数据一起放入内存中运行. 1.2示例:控制(操作码)与数据信息(操作数) 1.3一个典型的PC总线(Bus)结构 1.4华硕P5VD2-MX (1)主芯片组:VIA P4M890/VIA VT8237A(2)内存规格内存类型DDRII(3)总线频率(MHz) FSB 1066MHz(4)扩展插槽 ①显卡插槽PCI-E 16X ②PCI 插槽2条PCI 插槽 ③1条PCI-E 1X(5)IDE 插槽二个IDE插槽

linux用户态和内核态通信之netlink机制【转】

本文转载自:http://blog.csdn.net/zcabcd123/article/details/8272360 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实现与分析>中的源码imp2的分析.其中的源码,可以到以下URL下载: http://www-128.ibm.com/developerworks/cn/Linux/l-netlink/imp2.tar.gz [size=3]参考文档[/size] <linux 系统内核空间与用户空间通信的实现与分析

linux 用户态 内核态

http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){   2.     if(0 = = fork()){   3.     printf(“create new process suc

linux用户态与内核态

系统调用:如何中用户态切换到内核态 在linux中,系统调用是通过0x86体系结构中的软件中断实现的.这个软件中断与通常说的硬件中断不同之处在于,它是通过软件指令触发,而不是外部设备,这是程序员可以触发的一种异常,调用int 0x80汇编指令就可以产生向量号为128的异常. 进程与线程的区别与联系 操作系统教科书上讲的理论东西就不说了,这里说说linux中复制进程和复制线程的异同. 我们知道,Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork().内核提供了两个系统调用