多线程程序设计---1

一、什么是线程

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

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

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

二、函数学习

1创建线程

1).函数名

pthread_create

2).函数原型

int  pthread_create(pthread_t *thread, const pthread_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).函数原型

 int pthread_join(pthread_t thread,void  **retval)

3).函数功能

  用于等待线程结束

4).所属头文件

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

  gcc –lpthread

5).返回值

  成功:0

  失败:错误编号

6).参数说明

  thread:要等待结束的线程id

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

3退出线程

1).函数名

pthread_exit

2).函数原型

void pthread_exit(void *retval)

3).函数功能

  结束线程

4).所属头文件

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

  gcc –lpthread

5).返回值

  空

6).参数说明

  retval:保存返回值

三、线程互斥

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

3.1互斥锁初始化

1).函数名

 pthread_mutex_init

2).函数原型

int pthread_mutex_init(pthread_mutex_t *restrict mutex ,const pthread_mutexarrt_t *restrict attr);

3).函数功能

  初始化互斥锁

4).所属头文件

  <pathread.h>

5).返回值

  成功:0

  失败:错误的编码

6).参数说明

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

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

3.2获取互斥锁

1).函数名

pthread_mutex_lock

2).函数原型

 int  pthread_mutex_lock(pthread_mutex_t *mutex);

3).函数功能

  锁住互斥锁

4).所属头文件

  <pthread.h>

5).返回值

  成功:0

  失败:错误的编码

6).参数说明

  mutex:要锁住互斥锁的指针

3.3释放互斥锁

1).函数名

pthread_mutex_unlock

2).函数原型

int  pthread_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
 5 pthread_t thread[2];
 6 int number = 0;
 7
 8 pthread_mutex_t mut;
 9
10 void *worker1()
11 {
12     int i=0;
13     printf("I am worker1\n");
14     for(i=0;i<10;i++)
15     {
16         pthread_mutex_lock(&mut);
17         number++;
18         pthread_mutex_unlock(&mut);
19         printf("worker1 number is %d\n",number);
20         sleep(1);
21     }
22     pthread_exit(NULL);
23 }
24
25
26 void *worker2()
27 {
28     int i=0;
29     printf("I am worker2\n");
30     for(i=0;i<10;i++)
31     {
32         pthread_mutex_lock(&mut);
33         number++;
34         pthread_mutex_unlock(&mut);
35         printf("worker2 number is %d\n",number);
36         sleep(1);
37     }
38     pthread_exit(NULL);
39 }
40
41 int main()
42 {
43     pthread_mutex_init(&mut,NULL);
44
45     //创建工人1线程
46     pthread_create(&thread[0],NULL ,worker1,NULL);
47
48     //创建工人2线程
49     pthread_create(&thread[1],NULL ,worker2,NULL);
50
51     //等待工人1线程结束
52     pthread_join(thread[0],NULL);
53
54     //等待工人2线程结束
55     pthread_join(thread[1],NULL);
56
57
58     return 0;
59 }
 
时间: 2024-08-03 23:34:50

多线程程序设计---1的相关文章

深入浅出MFC——MFC多线程程序设计(七)

1. 从操作系统层面看线程——三个观念:模块(MDB).进程(PDB).线程(TDB) 2. “执行事实”发生在线程身上,而不在进程身上.也就是说,CPU调度单位是线程而非进程.调度器据以排序的,是每个线程的优先级. 3. MDB.PDB和TDB: 注:Thread Context:线程环境,也即构成线程的“后台”. 4. 从程序设计层面看线程——Worker Threads 和 UI Threads: 5. MFC多线程程序设计——探索CWinThread. 6. Worker Thread:

由《win32多线程程序设计》临界区的问题所想

之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLists(List *list, List *list2){ List *tmp_list; EnterCriticalSection(list1->critical_sec); EnterCriticalSection(list2->critical_sec); tmp->list = li

POSIX多线程程序设计_流水线工作例程

#include<pthread.h> #include "errors.h" typedef struct stage_tag{<span style="white-space:pre"> </span>//流水线的工作单元结构体 pthread_mutex_t mutex;<span style="white-space:pre"> </span>//保护当前工作单元数据的互斥锁 p

Linux多线程程序设计------创建线程

1.创建线程 #include<pthread.h> int pthread_create(pthread_t* tidp,const pthread_attr_t *attr,void*(*start_rtn)(void),void*arg) tidp:线程id attr:线程属性(通常为空) start_rtn:线程要执行的函数 arg:start_rtn的参数 Linux多线程程序设计------创建线程,布布扣,bubuko.com

多线程程序设计的8个规则

另外一篇 : http://blog.csdn.net/mousebaby808/article/details/7092031 在Intel,并行化技术主要有四个步骤:分析,设计与实现,调试以及性能调优.这些步骤用来对一段串行代码进行并行化.尽管这四个步骤中的第一.三.四步都已经有了很多相关文档,但是关于怎样进行设计与实现的却不多. 并行编程更像是一门艺术,而不是一门科学.这里将会给出八条设计多线程程序的简单规则,你可以把他们一一放进你的多线程程序设计百宝箱中.通过参考这些规则,你能写出高质量

多线程程序设计学习(2)之single threaded execution pattern

Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResource(共享资源) 二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候 三:single threaded execution p

Linux多线程程序设计

一.线程理论基础 使用线程原因: 1.比进程更加节俭.线程是轻量级的.进程:代码共享,数据拷贝.线程所有都是共享的. 2.通信简单很多 3.多线程程序是一种多任务.并发的工作机制.还有如下优点: 使多CPU系统更加有效.操作系统会保证当线程数不大于CPU数目时,不同线程运行于不同的CPU上. 改善程序结构:一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改. 多线程: Linux多线程遵循POSIX线程接口,称为pthread.编程时,需要头文件

Qt多线程程序设计中,可使用信号和槽进行线程通信

Qt多线程程序设计中,可使用信号和槽进行线程通信.下面是一个简单的示例. 该程序实现了线程中自定义一个信号和槽,定时1秒发送信号,槽响应后打印一条信息. [cpp] view plain copy  #include <QtCore/QCoreApplication> #include <QThread> #include <stdio.h> class MyThread:public QThread { Q_OBJECT public: MyThread(); voi

Win32多线程程序设计

Win32多线程程序设计 "多线程多任务"是程序开发者和用户都需要的一个重要资产.从WindowsNT开始,完全支持32位程序的抢占式多任务.带领我们进入了"多线程多任务"时代. 基本概念 进程(processes) 从win32角度来看,进程含有内存和资源,被进程拥有的内存理论上可达2GB,资源包括内核对象(handle,mutex-),user资源(对话框,字符串-),GDI资源(cdc和brush-). 内存(memory) 每个进程存储数据的地方,分为: C

Linux多线程程序设计-----线程标示

#include<pthread.h> pthread_t pthread_self(void) 功能:获取调用线程的thread identifer 例如:thread_id.c 运行结果: 清除: 线程终止有两种情况:正常终止和非正常终止 当某段代码可能出现不可预料的终止时,可以用pthread_cleanup_push和pthread_cleanup_pop将代码保护起来. 凡是用push和pop框起来的代码,不管是正常退出还是异常退出,在退出之前,都将执行push所指定的清除函数.包括