线程
来源:互联网 发布:mysql区分大小写查询 编辑:程序博客网 时间:2024/06/08 03:00
一、线程标识
- 线程有ID, 但不是系统唯一, 而是进程环境中唯一有效.
- 线程的句柄是pthread_t类型, 该类型不能作为整数处理, 而是一个结构.
两个函数:
- 头文件: <pthread.h>
- 原型: int pthread_equal(pthread_t tid1, pthread_t tid2);
- 返回值: 相等返回非0, 不相等返回0.
- 说明: 比较两个线程ID是否相等.
- 头文件: <pthread.h>
- 原型: pthread_t pthread_self();
- 返回值: 返回调用线程的线程ID.
二、线程创建
在执行中创建一个线程, 可以为该线程分配它需要做的工作(线程执行函数), 该线程共享进程的资源. 创建线程的函数pthread_create()
- 头文件: <pthread.h>
- 原型: int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(start_rtn)(void), void *restrict arg);
- 返回值: 成功则返回0, 否则返回错误编号.
- 参数:
- tidp: 指向新创建线程ID的变量, 作为函数的输出.
- attr: 用于定制各种不同的线程属性, NULL为默认属性(见下).
- start_rtn: 函数指针, 为线程开始执行的函数名.该函数可以返回一个void*类型的返回值,而这个返回值也可以是其他类型,并由 pthread_join()获取
- arg: 函数的唯一无类型(void)指针参数, 如要传多个参数, 可以用结构封装.
linux下多线程程序的编译方法:
因为pthread的库不是linux系统的库,所以在进行编译的时候要加上
-lpthread
# gcc filename -lpthread //默认情况下gcc使用c库,要使用额外的库要这样选择使用的库
程序:
#include <stdio.h>
#include <pthread.h> //包线程要包含
void *mythread1(void)
{
int i;
for(i=0;i<100;i++)
{
printf("this is the 1st pthread,created by zieckey.\n");
sleep(1);
}
}
void *mythread2(void)
{
int i;
for(i=0;i<100;i++)
{
printf("this is the 2st pthread,created by zieckey.\n");
sleep(1);
}
}
int main()
{
int =0,ret=0;
pthread_tid1,id2;
ret=pthread_create(&id1,NULL,(void*)mythread1,NULL);
if(ret)
{
printf("create pthread error!\n");
return1;
}
ret=pthread_create(&id2,NULL,(void*)mythread2,NULL);
if(ret)
{
printf("create pthread error!\n");
return1;
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
pthread_create()中的attr参数是一个结构指针,结构中的元素分别对应着新线程的运行属性,主要包括以下几项:
__detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到 PTHREAD_CREATE_JOINABLE状态。
__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和 SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过 pthread_setschedparam()来改变。
__schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
__scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值: PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
pthread_attr_t结构中还有一些值,为了设置这些属性,POSIX定义了一系列属性设置函数,包括pthread_attr_init()、 pthread_attr_destroy()和与各个属性相关的pthread_attr_get(),pthread_attr_set()函数。
pthread_create()中,第二个参数(pthread_attr_t)为将要创建的thread属性。通常情况下配置为NULL,使用缺省设置就可以了。但了解这些属性,有利于更好的理解thread.
属性对象(pthread_attr_t)是不透明的,而且不能通过赋值直接进行修改。系统提供了一组函数,用于初始化、配置和销毁每种对象类型。
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 类型“Microsoft.VisualStudio.Tools.Office.Ribbon.View.GenericRibbonView”没有名为“Factory”的属性。
- svn 文件状态标记的含义
- 一个Native Service的完整示例
- [bzoj2152]聪聪可可 点分
- 使用JavaScript判断手机是处于横屏还是竖屏
- 线程
- 创新实训6.8 改了很多bug(各个方面都有
- android 6.0动态弹框申请权限实现
- R语言利用ROCR评测模型的预测能力
- 一个Native Service的完整示例
- 廖师兄springboot学习笔记二(增加IDEA单模块jsp和多模块jsp引入)
- Windows 7 64位安装TenSorFlow详细步骤
- URL资源请求
- 总结共享