Linux--线程

线程概念:共享进程地址空间的多任务结构

创建线程的相关函数:
        1. int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
            参数1 :线程ID指针
            参数2 :线程属性,使用时通常为NULL,使用默认属性
            参数3 :线程函数指针
            参数4 :线程函数入参
            返回值:0 成功,-1 失败
            #include <pthread.h>
        2. int pthread_join(pthread_t thread, void **retval);
            参数1:等待退出的线程ID
            参数2:线程的结束信息,通常为NULL,不为NULL时注意参数为void,
                    需要与pthread_exit配合使用。
            返回值:0 成功,-1 失败
            #include <pthread.h>

线程互斥(强调共享资源和资源的完整性):
        1.int  pthread_mutex_init(pthread_mutex_t  *mutex,
                        pthread_mutexattr_t *attr)
            功能:初始化锁
            参数1:初始化的锁
            参数2:锁属性,使用时通常为空,使用默认属性
            返回值:0 成功,-1 失败
            #include <pthread.h>
        2. int  pthread_mutex_lock(pthread_mutex_t *mutex)  
            功能:加锁
            参数1:锁
            返回值:0 成功, -1 失败
            #include <pthread.h>
       3.int  pthread_mutex_unlock(pthread_mutex_t *mutex)
            功能:解锁
            参数1:锁
            返回值:0 成功, -1 失败
            #include <pthread.h>
线程同步(强调线程顺序):
        1.int sem_init(sem_t *sem, int pshared, unsigned int value);
            功能:初始化信号灯
            参数1:被初始化的信号灯
            参数2:使用范围,0线程范围内使用, 1进程范围内使用
            参数3:信号灯持有资源个数
            返回值:0 成功, -1失败
            #include <semaphore.h>
        2.int  sem_wait(sem_t *sem)
            功能:申请资源,申请成功后信号灯的资源个数减1,当资源个数为0时阻塞
            参数1:信号灯指针
            返回值:0 成功, -1失败
            #include <semaphore.h>
        3.int  sem_post(sem_t *sem)
            功能:释放资源,释放成功后信号灯的资源个数加1,释放资源后唤醒等待的线程
            参数1:信号灯指针
            返回值:0 成功, -1失败
            #include <semaphore.h>

 1 /*线程创建*/
 2 #include <stdio.h>
 3 #include <pthread.h>
 4
 5 void *ThreadFunc(void *arg)
 6 {
 7     printf("hello");
 8     pthread_exit("thread eixt");
 9 }
10
11 int main ()
12 {
13     pthread_t tID=0;
14     if(0 != pthread_create(&tID,NULL,ThreadFunc,NULL))
15     {
16         printf("creat error\r\n");
17     }
18     //sleep(1);
19     char *pMsg=NULL;
20     pthread_join(tID,(void **)&pMsg);
21     printf("%s\r\n",pMsg);
22     return 0;
23 }
 1 /*线程同步*/
 2 #include <stdio.h>
 3 #include <pthread.h>
 4 #include <semaphore.h>
 5 sem_t g_sem1;
 6 sem_t g_sem2;
 7 void *Func1(void *arg)
 8 {
 9     int i = 10;
10     while(i--)
11     {
12         sem_wait(&g_sem1);
13         printf("hello\r\n");
14         sleep(1);
15         sem_post(&g_sem2);
16     }
17 }
18 void *Func2(void *arg)
19 {
20     int i = 10;
21     while(i--)
22     {
23         sem_wait(&g_sem2);
24         printf("world\r\n");
25         sleep(1);
26         sem_post(&g_sem1);
27     }
28 }
29
30 int main()
31 {
32     pthread_t tID1 = 0;
33     pthread_t tID2 = 0;
34
35     if (0 != sem_init(&g_sem1, 0, 1) || 0 != sem_init(&g_sem2, 0, 0))
36     {
37         return -1;
38     }
39
40     if (0 != pthread_create(&tID1, NULL, Func1, NULL))
41     {
42         return -1;
43     }
44     if (0 != pthread_create(&tID2, NULL, Func2, NULL))
45     {
46         return -1;
47     }
48     pthread_join(tID1, NULL);
49     pthread_join(tID2, NULL);
50     return 0;
51 }
 1 /*互斥锁*/
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <pthread.h>
 5
 6 #define ARR_SIZE 10
 7
 8 pthread_mutex_t g_mutex;
 9
10 void *Func(void *arg)
11 {
12     if(NULL==arg)
13     {
14         return (void *)NULL;
15     }
16     pthread_mutex_lock(&g_mutex);
17     char *pTmp=(char *)arg;
18     static char s_arr[ARR_SIZE+2] = {0};
19     int 1=0;
20     for (;i<10;i++)
21     {
22         s_arr[i]=pTmp[i];
23         usleep(2000);
24     }
25     pthread_mutex_unlock(&g_mutex);
26     printf("%s\r\n",s_arr);
27 }
28
29 int main ()
30 {
31     char arr1[ARR_SIZE]={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘};
32     char arr2[ARR_SIZE]={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘0‘};
33     pthread_t tID1=0;
34     pthread_t tID2=0;
35
36     pthread_mutex_init(&g_mutex,NULL);
37
38
39     if(0!=pthread_create(&tID1,NULL,Func,(void *)arr1))
40     {
41         return -1;
42     }
43     if(0!=pthread_create(&tID2,NULL,Func,(void *)arr12))
44     {
45         return -1;
46     }
47     pthread_join(tID1,NULL);
48     pthread_join(tID2,NULL);
49 }
时间: 2024-10-11 10:40:02

Linux--线程的相关文章

[转载]Linux 线程实现机制分析

本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是如何看待和解决兼容性和效率这两个问题的. 一.基础知识:线程和进程 按照教科书上的定义,进

Linux 线程与进程,以及通信

http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-id-3025213.html 1.首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.进程是程序在某个数据集上的执行,

linux线程(二)内存释放

linux线程有两种模式joinable和unjoinable. joinable线程:系统会保存线程资源(栈.ID.退出状态等)直到线程退出并且被其他线程join. unjoinable线程:系统会在线程退出时自动回收线程资源. linux线程创建后默认为joinable模式,因此线程退出时不会释放资源.若程序中大量的创建线程并未处理,则会导致内存泄漏,最终将导致不能继续创建线程. 应用举例: 1. 一般情况我们并不关注线程的状态,只是让其执行一些操作,所以要将线程设为unjoinable.实

linux线程

linux线程私有的部分:每个线程都拥有一个独立的程序计数器,进程栈和一组进程寄存器 linux进程切换时通过TSS段,TSS中的esp0和ss0都是系统初始化设置的,指向进程创建时候,分配的栈空间.当进程切换的时候,在内核态下才进行进程切换,在0.11版本中,当前进程的寄存器被压入当前进程的TSS中,然后利用长跳转指令来到下一个TSS中,把这个TSS中的寄存器数据全给赋给寄存器(用于恢复寄存器)

Linux 线程模型的比较:LinuxThreads 与 NPTL

Linux 线程模型的比较:LinuxThreads 与 NPTL 本文参照来源:IBM开发者论坛 前奏:关于POSIX 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945.此标准源于一个大约开始于1985年的项目.POSIX这个名称是由理查德·斯托曼应IEE

Linux 线程 条件变量

下面是一个多线程,生产者消费者问题,一个队列放暂存的数据: 1 #include <iostream> 2 #include <queue> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <pthread.h> 6 7 using std::cout; 8 using std::endl; 9 using std::queue; 10 11 #define N 100 12 #def

Linux 线程(进程)数限制分析

1.问题来源 公司线上环境出现MQ不能接受消息的异常,运维和开发人员临时切换另一台服务器的MQ后恢复.同时运维人员反馈在出现问题的服务器上很多基本的命令都不能运行,出现如下错误: 2.   初步原因分析和解决 让运维的兄弟在服务上查看内存.CPU.网络.IO等基本信息都正常.于是自己到运维的服务器上看了一下,下面是slabtop –s c的运行结果,问题初步原因貌似出现了: 如果看到这个截图你看不出什么异常的话,下面的内容你可能不感兴趣,哈哈... task_struct是内核对进程的管理单位,

linux线程的实现

http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间.支持多线程的内核叫做多线程内核(Multi-Threads kernel ). 轻量级进程 轻量级线程(LWP)是一种由内核支持的用户线程.它是基于内核线程的高级

linux线程资源回收

from:http://blog.csdn.net/skyflying2012/article/details/24655751及相关论坛 http://blog.chinaunix.net/uid-29783732-id-4485673.html 在写网络服务器程序时可能需要实现多线程接收多个客户端的数据,我实现方式比较傻,死循环等待client的connect,connect之后创建thread,这样其实有一个问题,服务器程序需要长期运行,长时间线程的创建,线程资源的回收就是一个问题. Li

浅析Linux线程中数据

本文首先概述了线程中有哪些数据私有的,以及进程中哪些数据线程是共享的,然后详细分析了线程在用户空间中的数据,最后通过一个多线程程序来分析线程中的数据分布. 概述 线程包含了表示进程内执行环境必需的信息,其中包括进程中标识的线程ID.一组寄存器值.栈.调度优先级和策略.信号屏蔽字(每个线程有自己的信号屏蔽字,但对某个信号的处理方式是进程中所有线程共享的).errno变量(每个线程都自己的局部errno)以及线程私有数据.进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本.程序的全局内