您的位置:首页 > 其它

多线程程序设计---1

2016-04-11 22:41 351 查看
一、什么是线程

  1.线程就是“轻量级”的进程。

  2.线程与创建它的进程共享代码段,数据段。

  3.线程拥有自己独立的栈。

二、函数学习

1创建线程

1).函数名

pthread_create


2).函数原型

intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg)


3).函数功能

创建一个新的线程

4).所属头文件

  <pthread.h>特别注意:编译时候必须链接pthread库

  gcc–lpthread

5).返回值

  成功:0

  失败:错误编码

6).参数说明

  thread:新创建的线程ID

  attr:待创建线程的属性,一般为NULL

  start_routine:线程的入口函数

  arg:线程入口函数的参数,可以为NULL

2等待线程结束

1).函数名

pthread_join


2).函数原型

 intpthread_join(pthread_tthread,void**retval)


3).函数功能

  用于等待线程结束

4).所属头文件

  <pthread.h>特别注意:编译时候必须链接pthread库

  gcc–lpthread

5).返回值

  成功:0

  失败:错误编号

6).参数说明

  thread:要等待结束的线程id

  retval:保存线程退出时的状态,一般为NULL

3退出线程

1).函数名

pthread_exit


2).函数原型

voidpthread_exit(void*retval)


3).函数功能

  结束线程

4).所属头文件

  <pthread.h>特别注意:编译时候必须链接pthread库

  gcc–lpthread

5).返回值

  空

6).参数说明

  retval:保存返回值

三、线程互斥

  在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)是互斥机制中的一种。

3.1互斥锁初始化

1).函数名

 pthread_mutex_init


2).函数原型

intpthread_mutex_init(pthread_mutex_t*restrictmutex,constpthread_mutexarrt_t*restrictattr);


3).函数功能

  初始化互斥锁

4).所属头文件

  <pathread.h>

5).返回值

  成功:0

  失败:错误的编码

6).参数说明

  mutex:要初始化互斥锁的指针

  attr:可以添加的属性,为空则为默认属性

3.2获取互斥锁

1).函数名

pthread_mutex_lock


2).函数原型

 intpthread_mutex_lock(pthread_mutex_t*mutex);


3).函数功能

  锁住互斥锁

4).所属头文件

  <pthread.h>

5).返回值

  成功:0

  失败:错误的编码

6).参数说明

  mutex:要锁住互斥锁的指针

3.3释放互斥锁

1).函数名

pthread_mutex_unlock


2).函数原型

intpthread_mutex_unlock(pthread_mutex_t*mutex);


3).函数功能

  解开互斥锁

4).所属头文件

  <pthread.h>

5).返回值

  成功:0

  失败:错误的编码

6).参数说明

  mutex:要解开互斥锁的指针

四、实例学习

  通过主函数创建两个进程,使这两个进程交互完成一项任务

1#include<pthread.h>
2#include<string.h>
3#include<stdio.h>
4
5pthread_tthread[2];
6intnumber=0;
7
8pthread_mutex_tmut;
9
10void*worker1()
11{
12inti=0;
13printf("Iamworker1\n");
14for(i=0;i<10;i++)
15{
16pthread_mutex_lock(&mut);
17number++;
18pthread_mutex_unlock(&mut);
19printf("worker1numberis%d\n",number);
20sleep(1);
21}
22pthread_exit(NULL);
23}
24
25
26void*worker2()
27{
28inti=0;
29printf("Iamworker2\n");
30for(i=0;i<10;i++)
31{
32pthread_mutex_lock(&mut);
33number++;
34pthread_mutex_unlock(&mut);
35printf("worker2numberis%d\n",number);
36sleep(1);
37}
38pthread_exit(NULL);
39}
40
41intmain()
42{
43pthread_mutex_init(&mut,NULL);
44
45//创建工人1线程
46pthread_create(&thread[0],NULL,worker1,NULL);
47
48//创建工人2线程
49pthread_create(&thread[1],NULL,worker2,NULL);
50
51//等待工人1线程结束
52pthread_join(thread[0],NULL);
53
54//等待工人2线程结束
55pthread_join(thread[1],NULL);
56
57
58return0;
59}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: