0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux下线程编程(2)

wang123a 来源:嵌入式技术 作者:嵌入式技术 2022-08-24 15:48 次阅读

Linux下线程编程(2)

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

 1.6 线程取消函数pthread_cancel

int pthread_cancel(pthread_t thread);
函数功能:
  取消同一进程中的其他线程。
形 参:
  pthread_t thread — 线程描述符
返回值: 0 — 成功,其他值 — 失败

  示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    int data=*(int *)arg;
    while(1)
    {
        printf("data=%d\n",data);
        sleep(1);
        data++;
    }
}
int main()
{
    int data=10;
    pthread_t pth_id;
    if(pthread_create(&pth_id,NULL,start_routine_func,&data)!=0)
    {
        printf("线程创建失败\n");
        return 0;
    }
    printf("子线程ID:%lu\n",pth_id);
    while(1)
    {
        sleep(1);
        printf("主线程运行中data=%d\n",data);
        data++;
        if(data==15)
        {
            pthread_cancel(pth_id);//取消子线程
        }
    }
}
[xsw@xsw 系统编程]$ gcc pthread.c -lpthread
[xsw@xsw 系统编程]$ ./a.out 
子线程ID:3079162736
data=10
主线程运行中data=10
data=11
主线程运行中data=11
data=12
主线程运行中data=12
data=13
主线程运行中data=13
data=14
主线程运行中data=14
主线程运行中data=15
主线程运行中data=16
主线程运行中data=17

1.7 线程分离属性pthread_detach

创建一个线程默认的状态是joinable(结合属性),如果一个线程结束但没有调用pthread_join,则它的状态类似于进程中的zombie process(僵尸进程),即还有一部分资源没有被回收(退出状态码),所以创建线程时应该使用函数pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似进程中的wait、waitpid)。但是调用pthread_join(pthread_id)函数后,如果该线程没有运行结束,调用者会被阻塞,有些情况下我们并不希望如此。 pthread_detach函数可以将该线程状态设置为detached(分离状态),则该线程运行结束后自动会释放所有资源。

  函数原型:

int pthread_detach(pthread_t thread);
形 参:
  pthread_t thread — 线程标志符
返回值: 0 — 成功,其它值 – 失败

  示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    int data=*(int *)arg;
    while(1)
    {
        printf("data=%d\n",data);
        sleep(1);
        data++;
    }
}
int main()
{
    int data=10;
    pthread_t pth_id;
    if(pthread_create(&pth_id,NULL,start_routine_func,&data)!=0)
    {
        printf("线程创建失败\n");
        return 0;
    }
    printf("子线程ID:%lu\n",pth_id);
    //设置分离属性
    pthread_detach(pth_id);
    //等待子线程退出
    pthread_join(pth_id,NULL);//未设置分离属性则会阻塞主线程
    while(1)
    {
        sleep(1);
        printf("主线程运行中...\n");
    }
    return 0;
}
[xsw@xsw 系统编程]$ gcc pthread.c -lpthread
[xsw@xsw 系统编程]$ ./a.out 
子线程ID:3078335344
data=10

主线程运行中...
data=11
主线程运行中...
data=12
主线程运行中...
data=13
主线程运行中...
data=14
主线程运行中...
data=15

1.8 设置线程栈空间

  查看线程堆栈空间:

[wbyq@wbyq ~]$ ulimit -s
8192

  8192单位是KB,也就是默认栈空间大小为8M
  通过命令ulimit -a查看线程栈空间详细信息

[wbyq@wbyq ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15407
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15407
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

  通过命令ulimit -s <栈空间大小>

[wbyq@wbyq ~]$ ulimit -s 10240
[wbyq@wbyq ~]$ ulimit -s 
10240

  每个线程的栈空间都是独立的,如果堆栈空间溢出程序会出现段错误。如果一个进程有10个线程,那么分配的栈空间大小为10*<每个线程栈空间大小>

  示例:

#include 
int main()
{
    char buff[12*1024*1024+1]="hello,world\n";
    printf("buff=%s,%d",buff,sizeof(buff));
    return 0;
}
[xsw@xsw 系统编程]$ ./a.out 
段错误 (core dumped)

 1.9 通过函数设置和查询线程栈空间

#include 
#include 
#include 
int main()
{
    /*查看线程栈空间最小值*/
    printf("STACK_MIN:%d\n",PTHREAD_STACK_MIN);//16384byte--16kb
    pthread_attr_t attr;
    size_t ret,stack_size;
    ret=pthread_attr_init(&attr);//初始化线程属性
    if(ret!=0)
    {
        printf("初始化失败\n");
        return 0;
    }
    /*获取线程栈空间*/
    ret=pthread_attr_getstacksize(&attr,&stack_size);
    printf("线程栈空间:%ld kb\n",stack_size/1024);
    /*设置线程栈空间*/
    stack_size=8*1024*1024;//8M
    pthread_attr_setstacksize(&attr,stack_size);
    /*获取线程栈空间*/
    ret=pthread_attr_getstacksize(&attr,&stack_size);
    printf("修改后栈空间:%ld kb\n",stack_size/1024);
}
[wbyq@wbyq ubuntu]$ gcc main.c -pthread
[wbyq@wbyq ubuntu]$ ./a.out 
STACK_MIN:16384
线程栈空间:10240 kb
修改后栈空间:8192 kb

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10994

    浏览量

    206782
  • 函数
    +关注

    关注

    3

    文章

    3911

    浏览量

    61368
  • 线程编程
    +关注

    关注

    0

    文章

    5

    浏览量

    6105
收藏 人收藏

    评论

    相关推荐

    Linux下线程编程

    Linux下线程编程
    的头像 发表于 08-24 15:42 1720次阅读

    Linux开发_采用线程处理网络请求

    介绍Linux下网络编程线程编程,select机制,利用子线程响应TCP服务器的请求。
    的头像 发表于 09-17 15:21 663次阅读

    Linux线程编程基础知识解析

    线程是轻量级的进程(`LWP: Light Weight Process`),在`Linux`环境下线程的本质仍是`进程`,进程是资源分配的`最小单位`,线程是操作系统调度执行的`最小
    发表于 07-14 16:41 479次阅读
    <b class='flag-5'>Linux</b>多<b class='flag-5'>线程</b><b class='flag-5'>编程</b>基础知识解析

    Linux线程编程手册

    Linux线程编程手册
    发表于 11-07 10:17

    Linux c多线程编程的4个实例分享

    Linux c多线程编程的4个实例  在主流的操作系统中,多任务一般都提供了进程和线程两种实现方式,进程享有独立的进程空间,而线程相对于进程
    发表于 06-09 04:35

    嵌入式Linux线程编程

    嵌入式Linux线程编程-学习资源-华清远见清远见嵌入式学院:清远见嵌入式学院:《嵌入式应用程序设计》——第5 章 嵌入式Linux线程
    发表于 11-05 06:54

    如何对Linux系统多线程进行编程

    Linux系统编程第07期:多线程编程入门 6年嵌入式开发经验,在多家半导体...
    发表于 12-23 08:08

    linux线程编程课件

    电子发烧友为您提供了linux线程编程课件,希望对您学习 linux 有所帮助。部分内容如下: *1、多线程模型在单处理器模型和多处理器系
    发表于 07-10 11:58 0次下载

    linux线程编程开发

    本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux线程编程
    发表于 12-26 14:24 55次下载
    <b class='flag-5'>linux</b>多<b class='flag-5'>线程</b><b class='flag-5'>编程</b>开发

    线程编程Linux线程编程

    9.2 Linux线程编程 9.2.1 线程基本编程 这里要讲的线程相关操作都是用户空间中的
    发表于 10-18 15:55 3次下载

    Linux下的多线程编程

    的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。  下面我们先来尝试编写一个简单的多线程程序。2 简单的多线程编程  
    发表于 04-02 14:43 478次阅读

    嵌入式linux线程编程实验,嵌入式Linux线程编程-学习资源-华清远见.PDF

    嵌入式Linux线程编程-学习资源-华清远见清远见嵌入式学院:清远见嵌入式学院:《嵌入式应用程序设计》——第5 章 嵌入式Linux线程
    发表于 11-02 13:36 7次下载
    嵌入式<b class='flag-5'>linux</b>多<b class='flag-5'>线程</b><b class='flag-5'>编程</b>实验,嵌入式<b class='flag-5'>Linux</b>多<b class='flag-5'>线程</b><b class='flag-5'>编程</b>-学习资源-华清远见.PDF

    Linux中多线程编程的知识点

    Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。
    发表于 04-26 17:27 485次阅读
    <b class='flag-5'>Linux</b>中多<b class='flag-5'>线程</b><b class='flag-5'>编程</b>的知识点

    Linux线程线程与异步编程、协程与异步介绍

    线程之间的切换不需要陷入内核,但部分操作系统中用户态线程的切换需要内核态线程的辅助。 协程是编程语言(或者 lib)提供的特性(协程之间的切换方式与过程可以由
    的头像 发表于 11-11 11:35 433次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>线程</b>、<b class='flag-5'>线程</b>与异步<b class='flag-5'>编程</b>、协程与异步介绍

    linux线程编程实例

    linux线程
    的头像 发表于 02-15 21:16 78次阅读
    <b class='flag-5'>linux</b>多<b class='flag-5'>线程</b><b class='flag-5'>编程</b>实例