`
airu
  • 浏览: 267511 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

初识Linux线程

 
阅读更多
Linux的线程也是曲折的,2.4内核的时候居然线程使用进程来实现。不过2.6内核我是没看到有什么诡异的了。线程是线程,进程是进程。
为什么要线程呢?
线程的切换,不需要切换进程的上下文,比如N多寄存器值的保存。所以是轻量级的。速度也更快,但是同时也带来很多问题,比如同步。
现在让我们来简单看看Linux的线程吧。
下面的程序,通过多线程,并且互斥来对一个变量累加。

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h> 
#include<unistd.h>
#include<limits.h>

#define MAX 100
pthread_mutex_t  mutex; //互斥量
static int count; //需要同步的数据

void err_quit(char *msg)
{
        fprintf(stderr,"%s\n",msg);
        exit(0);
}
void *th_incre(void *arg) //一个线程执行的函数
{
        int pid;
        pthread_mutex_lock(&mutex);  //加锁互斥量
        pid = (int)arg;
        printf("%d thread and count=%d\n",pid,count);
        count++;
        pthread_mutex_unlock(&mutex); //别忘了解锁
        pthread_exit((void *)0);  //线程退出,也可以return,注意返回值
}

int main(int argc, char *argv[])
{
        pthread_t pid[MAX];
        int i,err;
        void *status[MAX];

        long max_thread=sysconf(_SC_THREAD_THREADS_MAX);//这句废话,Linux不支持
        printf("MAX_THREAD=%ld\n",max_thread);
        pthread_mutex_init(&mutex, NULL);//请不要忘记初始化互斥量,当然也可以用静态的PTHREAD_MUTEX_INITIALIZER
        for(i = 0; i < MAX; i++){
                err = pthread_create(&pid[i],NULL,th_incre,(void *)i); //这一句是关键。
                if(err != 0)
                    err_quit("create thread error");
                pthread_join(pid[i],&status[i]);//等待线程退出,很可能出错。在redhat5.5上出错
        }
        pthread_mutex_destroy(&mutex);//有初始化,就有销毁
         exit(0);
}




一个简单多线程程序。并使用了互斥量同步。当然,线程还有很多复杂的东西。以后再说。
对了,这里要说一下,在连接的时候请使用 -lpthread 选项,要加载线程库。
$gcc -g -Wall -lpthread -o count th_count.o 

分享到:
评论

相关推荐

    UNIX操作系统教程 张红光

    Window编程环境介绍295 14.2数据检索加工工具awk296 14.2.1awk基本描述296 14.2.2awk中的记录和字段297 14.2.3awk中使用的模式298 14.2.4awk中的...Linux系统中的C环境308 附录CUNIX/Linux常用命令314 参考文献...343

    ZMQ专题学习之一:初识ZeroMQ

    是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。  ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。是极具前景的并且是人们更加需要的“传统”BSD套接字之上的一层封装。ZMQ...

    java-concurrent-source:Java多并发编程从入门到精通源码-源码通

    并发运算1.10 Linux和Windows对于并发采取的不同机制第2章认识Java里面的线程2.1先来看一下线程的简单实现三种方法2.2线程里面的属性和方法2.3关于线程的中断机制2.4螺纹的生命周期2.5什么是守护线程2.6线程组2.7...

    Android系统源代码情景分析 / 罗升阳著

    在内容上,《Android系统源代码情景分析(含CD光盘1张)》结合使用情景,全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层...

    liunx内核源码解读

    1.Linux简介。 2.代码初识。 3.内核体系结构。 4.系统初始化。 5.系统调用。 6.信号量,中断和时间。 7.进程和线程 8.内存。 9.system V IPC 10.SMP 11.可调内核参数 各章分离,超级清晰。

    python-learning.zip

    01.初识Python.md 02.语言元素.md 03.分支结构.md 04.循环结构.md 05.构造程序逻辑.md 06.函数和模块的使用.md 07.字符串和常用数据结构.md 08.面向对象编程基础.md 09.面向对急进阶.md 10.图形用户界面和游戏开发....

    rustprimer-v1.13-大家新年快乐.pdf

    并发,并行,多线程编程 线程 消息传递 共享内存 同步 并行 Unsafe、原始指针 Unsafe 原始指针 FFI rust调用ffi函数 将rust编译成库 运算符重载 属性和编译器参数 属性 编译器参数 Cargo参数配置 测试与评测 测试 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 初识linux命令 08 linux操作系统目录结构 09 目录及文件操作 第4章 01 上节课复习 02 创建用户相关的文件 03 用户增删该查及组相关操作 04 对文件的权限管理 05 对目录的权限管理 06 权限管理补充 07 属主属组...

    《Android系统源代码情景分析》

    第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载Android源代码 1.3.2 编译Android源代码 1.3.3 运行Android...

    Android开发应用实战详解源代码

    1.1 初识android 1.1.1 历史背景 1.1.2 android特性 1.1.3 android组件结构 1.1.4 android应用程序框架 1.1.5 android的竞争优势 1.1.6 android模拟器 1.2 搭建android开发环境 1.2.1 准备工作 1.2.2 windows系统下...

    Android系统源代码情景分析-罗升阳-源码

    第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载Android源代码 1.3.2 编译Android源代码 1.3.3 运行Android模拟器 ...

    大数据培训课程安排.pdf

    主要技术包括:⼤数据前篇(什么是⼤数据,应⽤场景,如何学习⼤数据库,虚拟机概念和安装等)、Linux常见命令(⽂件管理、系 统管理、磁盘管理)、Linux Shell编程(SHELL变量、循环控制、应⽤)、Hadoop⼊门...

    深入理解Android:卷I--详细书签版

    此外,他对Linux内核、C/C++/Python相关的技术 ,以及高性能网络服务器和多核并行开发等也有一定的研究。 目录 封面 -17 封底 489 扉页 -16 版权 -15 推荐序 -14 前言 -12 致谢 -9 目录 -7 第1章 阅读前的准备...

    md格式编写的良心教程 Python 100天从新手到大师 共100个完整源文件 含课程源代码.rar

    初识Python.md Day01-15\02.语言元素.md Day01-15\03.分支结构.md Day01-15\04.循环结构.md Day01-15\05.构造程序逻辑.md Day01-15\06.函数和模块的使用.md Day01-15\07.字符串和常用数据结构.md Day01-15\08.面向...

    Android系统源代码情景分析光盘

    1.1 Linux内核参考书籍.................................................. 2 1.2 Android应用程序参考书籍....................................... 3 1.3 下载、编译和运行Android源代码........................

Global site tag (gtag.js) - Google Analytics