Linux C多线程编程-线程互斥
Linux下的多线程编程需要注意的是程序需要包含头文件pthread.h,在生成可执行文件的时候需要链接库libpthread.a或者libpthread.so。
线程创建函数:
pthread_create(pthread_t *thread, pthread_attr_t * attr, void *(*start_routine)(void *),void *arg);
参数说明:
Thread 标示一个线程,它是一个pthread_t类型的变量(unsigned long int)
attr 用于设置线程的属性,默认是null
start_routine当线程分配资源成功后,线程中所运行的单元,通俗的说就是你自己写的一个函数
Arg线程函数运行时传入的一个参数,一般可以用这个传入的参数去控制线程结束
函数返回值:
创建成功返回0,创建失败返回非0值,常见错误返回代码为EAGAIN何EINVAL,EGAIN标示系统中线程的数量达到上限,错误代码EINVAL表示线程的属性非法。
注意:线程创建城成功后,新创建的线程按照参数3和参数4确定一个运行函数,原来的线程在线程创建函数返回后继续运行下一行代码。
线程结束函数:pthread_join()和pthread_exit()
pthread_join()用来等待一个线程运行结束。这个函数是阻塞函数,一直被等待的线程结束为止,函数才返回并且收回被等待线程的资源。函数的原型为:
Extern int pthread_join_P((pthread_t _th,void **__thread_return));
_th:线程的标示符,也就是线程创建成功的值,在通俗的说就是pthread_create函数运行成功后的第一个参数
__thread_return:返回值,它是一个指针用来存贮被等待线程的返回值。
线程函数的结束方式有两种:一种是线程函数运行结束,不用返回结果;另一种就是通过函数pthread_exit()来实现,将结果传出。
函数原型是:
Extern void pthread_exit_P((void*_retval))
参数是函数的返回值,这个值可以被pthread_join函数捕获,通过__thread_return参数获得此值。
说道线程的创建还有一点必须要提及,那就是线程的属性。一般在我们创建线程的时候设置attr属性的时候都是使用null,这个是默认参数。但是在很多时候需要调整线程的属性,特别是线程优先级。
线程的属性结构为:pthread_attr_t,在头文件<pthreadtype.h>中定义
typedef struct
{
int detachstate; 线程的终止状态
int schedpolicy; 线程调度策略(优先级)
struct sched_param schedparam; 线程的调度参数
int inheritsched; 线程的继承性
int scope; 线程的作用域
size_t guardsize; 线程栈末尾的警戒缓冲区大小
int stackaddr_set; 运行栈
void * stackaddr; 线程栈的位置
size_t stacksize; 线程栈的大小
}pthread_attr_t;
要注意的是线程的属性值不能直接设置,必须要用先关的函数进行操作。线程属性的初始化函数pthread_attr_init(),这个函数必须在pthread_create()函数之前调用。
线程间的互斥:
线程的互斥函数有:互斥函数的初始化pthread_mutex_init(),互斥函数的锁定函数pthread_mutex_lock(),互斥函数的预锁定函数pthread_mutex_trylock(),互斥函数的解锁函数pthread_mutex_unlock(),互斥函数的销毁函数pthread_mutex_destroy()
废话不多说,上代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define MUXNUMBER 10
pthread_mutex_t test_mutex;
int testi = 0;
int testis[10 * 1000];
int count=0;
void testfun(void)
{
testis[testi] = testi * 2;
usleep(1000);
testi++;
}
void thread_func()
{
int m_count=0;
while(m_count<1000)
{
pthread_mutex_lock(&test_mutex);
testfun();
pthread_mutex_unlock(&test_mutex);
m_count++;
//sleep(1);
}
}
int main()
{
pthread_t t[10];
pthread_mutex_init(&test_mutex,NULL);
int i;
for(i=0;i<MUXNUMBER;i++)
{
if(pthread_create(&t[i],NULL,(void*)thread_func,NULL) == -1)
{
printf("create Thread error !\n");
exit(1);
}
//sleep(1);
}
for(i=0;i<MUXNUMBER;i++)
{
pthread_join(t[i],NULL);
//sleep(1);
}
pthread_mutex_destroy(&test_mutex);
for(i=0;i<10000;i++)
{
if(testis[i]!=i*2)
{
printf("第%d个数据出错!:%d\n",i,testis[i]);
}
}
return 0;
}
简单说下程序功能:程序创建十个线程,每个线程都调用testfun,通过互斥锁保证数据的正常。
代码比较简单,仅仅只是为了让读者强化下前面看的一些概念性的东西。
Linux C多线程编程-线程互斥的更多相关文章
- 【Linux C 多线程编程】互斥锁与条件变量
一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...
- 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
- [转]Linux 的多线程编程的高效开发经验
Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...
- Linux 的多线程编程的高效开发经验(转)
http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多 ...
- Linux 的多线程编程的高效开发经验
http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多 ...
- Linux下多线程编程遇到的一些问题
今天在学习了Linux的多线程编程的基础的知识点.于是就试着做了一个简单的Demo.本以为会得到预期的结果.不成想却遇到了意想不到的问题. 代码展示 我的C 代码很简单,就是一个简单的示例程序,如下: ...
- Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间, ...
- Linux 多线程编程--线程退出
今天分析项目中进程中虚存一直增长问题,运行10个小时虚存涨到121G ,RSS占用为16G 非常恐怖. Valgrind测试无内存泄漏. 内存32G 64bit系统信息如下: Linux线程使用方式是 ...
- Linux下多线程编程
一.为什么要引入线程? 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维 ...
随机推荐
- Spring框架中的aop操作之一 及aspectjweaver.jar与aopalliance-1.0.jar下载地址 包含beans 注解context 和aop的约束
(aspect oriented programming面向切面编程) 首先在原有的jar包: 需Spring压缩包中的四个核心JAR包 beans .context.core 和expression ...
- UIControlEvent
UIControlEventTouchDown = 1 << 0, // 手指落在按钮的一瞬间触发UIControlEventTouchDownRepeat ...
- javascript设计模式(张容铭) 第14章 超值午餐-组合模式 学习笔记
JS 组合模式更常用于创建表单上,比如注册页面可能有不同的表单提交模块.对于这些需求我们只需要有基本的个体,然后通过一定的组合即可实现,比如下面这个页面样式(如图14-2所示),我们来用组合模式实现. ...
- UVa-232-纵横字谜的答案
这一题的话,输出的时候,我们要按照3位输出,不能按照两位,因为是10*10的网格,所以就是100位,不管有没有100的起始格,它都是按照3位进行输出的,从题上的输出可以看到,不然的话,就会PE. 然后 ...
- (63)zabbix low-level discover zabbix批量部署必备
1. 概述 <zabbix发现配置>server通过配置好的规则,自动添加host.group.template <zabbix Active agent自动注册>与disco ...
- cdev_add
初始化 cdev 后,需要把它添加到系统中去.为此可以调用 cdev_add()函数.传入cdev 结构的指针,起始设备编号,以及设备编号范围. 函数首先将分配的设备号与设备数目保存进cdev结构体中 ...
- js prototype 添加属性对象
在本例中,我们将展示如何使用 prototype 属性来向对象添加属性: <script type="text/javascript"> function employ ...
- 00051_static关键字
1.static概念 当在定义类的时候,类中都会有相应的属性和方法.而属性和方法都是通过创建本类对象调用的.当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余.可是 ...
- BZOJ 2286 [Sdoi2011]消耗战 ——虚树
虚树第一题. 大概就是建一颗只与询问有关的更小的新树,然后在虚树上DP #include <map> #include <ctime> #include <cmath&g ...
- hihoCoder1381 - Little Y's Tree
Portal Description 给出一个\(n(n\leq10^5)\)个点的带边权的树.进行\(Q\)次询问:每次删除树上的\(k\)条边,求剩下的\(k+1\)个连通块中最远点对距离的和.\ ...