C语言中多线程编程包括的文件:#include<pthread.h>(linux环境下)

pthread_t //线程函数返回类型

pthread_mutrex_t //互斥锁类型

int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*func),void *arg);

参数说明

thread :指向thread_t类型变量的指针,用于保存线程的ID

typedef unsigned long int thread_t;

attr :指向pthread_attr_t类型变量的指针,或者为NULL

func:指向新线程所运行函数的指针

arg: 传递给func的参数

成功创建线程则返回0,否则返回非零

这个参数为线程属性,pthread_attr_t主要包括:scope属性,detach属性,堆栈地址,堆栈大小,优先级。参数设置为NULL则将采用默认的属性配置。

http://blog.csdn.net/hudashi/article/details/7709413

http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html

http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part1/

  Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。
pthread_attr_t的主要属性的意义如下:
__detachstate,表示新线程是否与进程中其他线程脱离同步, 如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用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一值。
  为了设置这些属性,POSIX定义了一系列属性设置函数,包括pthread_attr_init()、pthread_attr_destroy()和与各个属性相关的pthread_attr_getXXX/pthread_attr_setXXX函数。
在设置线程属性 pthread_attr_t 之前,通常先调用pthread_attr_init来初始化,之后来调用相应的属性设置函数。
主要的函数如下:
1、pthread_attr_init
功能:        对线程属性变量的初始化。
头文件:     <pthread.h>
函数原型:   int pthread_attr_init (pthread_attr_t* attr);
函数传入值:attr:线程属性。
函数返回值:成功: 0
                失败: -1
2、pthread_attr_setscope
功能:        设置线程 __scope 属性。scope属性表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
头文件:     <pthread.h>
函数原型:   int pthread_attr_setscope (pthread_attr_t* attr, int scope);
函数传入值:attr: 线程属性。
                      scope:PTHREAD_SCOPE_SYSTEM,表示与系统中所有线程一起竞争CPU时间,
                                 PTHREAD_SCOPE_PROCESS,表示仅与同进程中的线程竞争CPU
函数返回值得:同1。
3、pthread_attr_setdetachstate
功能:        设置线程detachstate属性。该表示新线程是否与进程中其他线程脱离同步,如果设置为PTHREAD_CREATE_DETACHED则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
头文件:      <phread.h>
函数原型:    int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);
函数传入值:attr:线程属性。
detachstate:PTHREAD_CREATE_DETACHED,不能用pthread_join()来同步,且在退出时自行释放所占用的资源
                    PTHREAD_CREATE_JOINABLE,能用pthread_join()来同步
函数返回值得:同1。
4、pthread_attr_setschedparam
功能:       设置线程schedparam属性,即调用的优先级。
头文件:     <pthread.h>
函数原型:   int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);
函数传入值:attr:线程属性。
                 param:线程优先级。一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0
函数返回值:同1。
5、pthread_attr_getschedparam
功能:       得到线程优先级。
头文件:    <pthread.h>
函数原型:  int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);
函数传入值:attr:线程属性;
                    param:线程优先级;
函数返回值:同1。

当线程的属性没有设置为PTHREAD_CREATE_DETACH时候,我们可以使用pthread_join等待进程结束,来释放资源。

函数原型

int pthread_join(pthread_t thread,void** retval)

参数说明:

thread:所等待的进程

retval:z指向某存储线程返回值的变量

返回值:0   成功返回

    errorcode 错误

 #include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <windows.h> int piao = ; pthread_mutex_t mut; void* tprocess1(void* args)
{
int a = ;
while (true)
{
pthread_mutex_lock(&mut);
if (piao>)
{
Sleep();
piao--;
printf("窗口1----------------还剩%d张票\n", piao);
}
else
{
a = ;
}
pthread_mutex_unlock(&mut);
if (a == )
{
break;
}
}
return NULL;
} void* tprocess2(void* args)
{
int a = ;
while (true)
{
pthread_mutex_lock(&mut);
if (piao>)
{
Sleep();
piao--;
printf("窗口2----------------还剩%d张票\n", piao);
}
else
{
a = ;
}
pthread_mutex_unlock(&mut);
if (a == )
{
break;
}
}
return NULL;
}
void* tprocess3(void* args)
{
int a = ;
while (true)
{
pthread_mutex_lock(&mut);
if (piao>)
{
Sleep();
piao--;
printf("窗口3----------------还剩%d张票\n", piao);
}
else
{
a = ;
}
pthread_mutex_unlock(&mut);
if (a == )
{
break;
}
}
return NULL;
}
void* tprocess4(void* args)
{
int a = ;
while (true)
{
pthread_mutex_lock(&mut);
if (piao>)
{
Sleep();
piao--;
printf("窗口4----------------还剩%d张票\n", piao);
}
else
{
a = ;
}
pthread_mutex_unlock(&mut);
if (a == )
{
break;
}
}
return NULL;
} int main() {
pthread_mutex_init(&mut, NULL);
pthread_t t1;
pthread_t t2;
pthread_t t3;
pthread_t t4;
pthread_create(&t4, NULL, tprocess4, NULL);
pthread_create(&t1, NULL, tprocess1, NULL);
pthread_create(&t2, NULL, tprocess2, NULL);
pthread_create(&t3, NULL, tprocess3, NULL);
Sleep();
return ;
}
//线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h> static void pthread_func_1 (void);
static void pthread_func_2 (void); int main (int argc, char** argv)
{
pthread_t pt_1 = ;
pthread_t pt_2 = ;
pthread_attr_t atrr = {};
int ret = ; /*初始化属性线程属性*/
pthread_attr_init (&attr);
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);
if (ret != )
{
perror ("pthread_1_create");
} ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);
if (ret != )
{
perror ("pthread_2_create");
} pthread_join (pt_2, NULL); return ;
} static void pthread_func_1 (void)
{
int i = ; for (; i < ; i++)
{
printf ("This is pthread_1.\n"); if (i == )
{
pthread_exit ();
}
} return;
} static void pthread_func_2 (void)
{
int i = ; for (; i < ; i ++)
{
printf ("This is pthread_2.\n");
} return;
}

最新文章

  1. yum 部署nginx
  2. Android实例-闪光灯的控制(XE8+小米2)
  3. AHB总线和APB总线
  4. 1、shell 简介
  5. 用户向导页面实现左右滑动的ViewPager
  6. leak finder
  7. Redis的数据结构之字符串
  8. 2019西湖论剑网络安全技能大赛(大学生组)--奇怪的TTL字段(补充)
  9. 【转载】linux下升级npm以及node
  10. Spark记录-Scala字符串
  11. JSTL时间格式化项目小试
  12. static变量生命周期小研究
  13. 出了一个js的题。
  14. python学习笔记——多进程中的锁Lock
  15. uva11020 set
  16. 【BZOJ】2006: [NOI2010]超级钢琴(前缀和+RMQ+堆)
  17. 如何判断一个 APP页面是否是H5页面(转载)
  18. Unity3D开发之Matrix4x4矩阵变换
  19. Java和js的区别,以及Java和c的区别
  20. HDU 2149 Public Sale 拍卖(巴什博弈)

热门文章

  1. 图解Windows下 GIT GUI 使用教程
  2. Convert ResultSet to JSON and XML
  3. protobuf 动态创建
  4. TableView 无数据时展示占位视图
  5. webstorm11.0下载地址和webstorm11.0破解程序patcher.exe下载使用方法说明 前端IDE工具的利器
  6. LRU原理和Redis实现——一个今日头条的面试题(转载)
  7. Spring Boot系列——7步集成RabbitMQ
  8. 华为S12700 NQA配置
  9. 纯CSS3浮雕质感的立体文字旋转动画
  10. NO.1 hadoop简介