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多线程编程-线程互斥的更多相关文章

  1. 【Linux C 多线程编程】互斥锁与条件变量

    一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...

  2. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

  3. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

  4. Linux 的多线程编程的高效开发经验(转)

    http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多 ...

  5. Linux 的多线程编程的高效开发经验

    http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多 ...

  6. Linux下多线程编程遇到的一些问题

    今天在学习了Linux的多线程编程的基础的知识点.于是就试着做了一个简单的Demo.本以为会得到预期的结果.不成想却遇到了意想不到的问题. 代码展示 我的C 代码很简单,就是一个简单的示例程序,如下: ...

  7. Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间, ...

  8. Linux 多线程编程--线程退出

    今天分析项目中进程中虚存一直增长问题,运行10个小时虚存涨到121G ,RSS占用为16G 非常恐怖. Valgrind测试无内存泄漏. 内存32G 64bit系统信息如下: Linux线程使用方式是 ...

  9. Linux下多线程编程

    一.为什么要引入线程? 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维 ...

随机推荐

  1. FIFO设计思考之一

    不管同步FIFO还是异步FIFO,设计难点是full/empty状态flag的正确性. 要保证任何情况 FULL时NO WRITE,EMPTY时NO READ.overflow / underflow ...

  2. 学习Python第一天,命令很多跟Linux还有脚本语言相似。

    学习Python第二天,看了一天,有点头疼,准备先休息一会,再继续.有一点C语言和Java基础,学起来不是很费劲.学习热情尚好. 学习了dir,math模块,import加载模块,有跟Linux相似的 ...

  3. 树形 dp

    // ACM训练联盟周赛     C. Teemo's tree problem There is an apple tree in Teemo's yard. It contains n nodes ...

  4. PAT Basic 1065

    1065 单身狗 “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣 ...

  5. PAT Basic 1053

    1053 住房空置率 在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为“可能 ...

  6. !!注意!部署出现the requested resource is not available

    避免项目里重复包出现 同时tomcat的lib里避免重复包,也会出现requested resource isnot available!

  7. XML文件的操作说明

    说明:C#中XmlNode与XmlElement的区别如下:xmlnode类表示xml文档中的单个节点,其命名空间为:System.Xml.XmlNode的三个最主要的子类包括:XmlDocument ...

  8. MySQL5.7多源复制实践

    MySQL5.7开始新增多源复制功能,即允许一个salve同时复制多个主库的事务,slave会创建通往每个主库的管道.多源复制在应用来自多个源的事务的时候不会对有冲突的事务进行检测. 配置实现 主库支 ...

  9. 推荐两个不错的flink项目

    最近flink真是风生水起,但是浪院长看来这不过是阿里错过了创造spark影响力之后,想要在flink领域创建绝对的影响力.但是,不可否认flink在实时领域确实目前来看独树一帜,当然也有它不适合的地 ...

  10. UVA 11297 Census ——二维线段树

    [题目分析] 二维线段树模板题目. 简直就是无比的暴力.时间复杂度为两个log. 标记的更新方式比较奇特,空间复杂度为N^2. 模板题目. [代码] #include <cstdio> # ...