apue 学习笔记——线程

本文是作者学习APUE中线程控制部分的笔记,包括线程标识、创建、终止、同步等内容。通过实例介绍了互斥量、读写锁和条件变量的使用,如买书-卖书问题和生产者-消费者问题,阐述了线程同步的关键操作,并分享了学习过程中的难点与理解。

前序:

本人菜鸟学生一枚,从5月9号开始学习Linux,到现在整整一个月了,这一个月真的收获很大,特别充实。

由于毕业课题项目提前做完了,论文也写完了,坐等毕业的节奏,但是距毕业还有差不多一年的时间,感觉这段时间不应该就这么荒废掉,应该做点有意义的事情。

之前都是搞裸机项目,从来没有接触操作系统,一直对它挺好奇的,现在终于有了充裕的时间可以干自己想干的事情了,所以决定学习一下Linux。自从入手,真是欲罢不能,这一个月每天的时间基本上都在看书和敲代码。

最开始是从鸟哥的Linux私房菜开始入手的,5月9号买下,5月25号基本看完,后面有些章节没看。5月25号买下apue,开始深入研究这本圣经,在看的时候真是给人一种意犹未尽和欲罢不能的感觉,不愧为一本经典之作。介绍的确实很深入,但大部分还是可以看懂的,很多地方真是值得细细品味。边看书、边敲代码、边时不时的搜一下相关内容的博客补充理解,不知不觉,全书已经看完了一半,现在刚刚看完第12章——线程控制。

自己的能量超乎了我的想象,入手时都说这本书很难,真是有些担心自己看不进去,没想到自己的进度会这么快,更没想到自己居然能激发出这么大兴趣,兴趣真的很重要。

半个月,看完了一半,匆匆走过,是时候回头做做总结了,是时候做点笔记了,就先从线程这一章开始吧。

自己的字太丑了,就用博客记录读书笔记吧!由于是菜鸟,自己的博客仅作自己的学习笔记之用。



线程标识

每个线程都有一个线程标识:线程ID,只在它所属的进程环境中有效。数据类型为:pthread_t
通过调用pthread_self()函数可以获取自己的ID。
pthread_t  pthread_self(void);

线程创建

int pthread_create( pthread_t *thread,   const pthread_attr_t *attr,  void *(*start_rtn)(void *),   void*arg );
若线程创建成功,返回0。若线程创建失败,则返回出错编号。
4个参数:
1,thread:线程ID指针
2,attr:设置线程属性
3,start_rtn:线程运行函数起始地址,函数指针
4,arg:线程函数的唯一入口参数,如果是多个参数,可以将把参数存放在一个结构中,然后将结构地址传递给arg。


线程终止

线程终止方式:
(1)线程从启动例程中简单的返回,返回值是线程的退出码;
(2)线程可以被同一进程的其他线程取消;pthread_cancel(pthread_t tid)
(3)线程调用pthread_exit函数。终止该线程,并返回一个指向某一对象的指针,可由其他函数如pthread_join来检索获取。

void  pthread_exit(void * retval)  //终止状态存于retval指向的单元


等待线程终止并获取终止状态

对于以可结合状态启动的线程(线程属性为PTHREAD_CREATE_JOINABLE)
int pthread_join(pthread_t tid, void ** retval) // 以阻塞方式等待指定线程tid结束,retval 用于获取线程的终止状态。
例:
pthread_t  tid;
void * tret;
void* tid_func(void * arg);

pthread_create(&tid,NULL,tid_func,NULL);//创建线程tid
pthread_join(tid,&tret);

注意:要确保调用完成之后,线程返回值指向的内存仍然是有效的。若线程返回值是线程内部定义的局部变量的指针,线程结束后,变量即被释放,此时返回值将变成野指针。

#include "apue.h"
#include <pthread.h>
void * thread_func(void * arg);

char s[]="Hello word!";

int main(void)
{
    int res;
    pthread_t td;
    void * retval;

    printf("main starting\n");
    
    res=pthread_create(&td,NULL,thread_func,s);
    if(res!=0)
    {
        printf("thread create error");
        return(1);
    }
    
    if(pthread_join(td,&retval)!=0)
    {
        printf("pthread_join error\n");
        return(1);
    }

    printf("thread1 return: %s\n",(char *)retval);
    printf("Now,the s becomming: %s\n",s)
MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
### APUE 第三章 学习笔记 #### 文件 I/O 基础 APUE 的第三章主要讨论了 Unix 系统中的文件 I/O 操作基础。这一章节涵盖了多个重要的概念和技术细节,对于理解如何高效地操作文件至关重要。 #### 打开和关闭文件 为了打开一个文件,程序通常会使用 `open` 或者 `creat` 函数[^1]。这两个函数都返回一个小于零的整数作为错误指示,而成功的调用则返回一个非负整数表示新创建的文件描述符。当不再需要访问某个特定文件时,应该通过调用 `close` 来关闭它。这不仅释放了与该文件关联的操作系统资源,而且也使得这个文件描述符能够被重新利用。 ```c #include <fcntl.h> /* For O_* constants */ #include <unistd.h> /* For open(), close() */ int fd; fd = open("example.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); if (fd >= 0) { // File opened successfully. } // Later... close(fd); ``` #### 文件读写 一旦有了有效的文件描述符,就可以对其进行读取 (`read`) 和写入 (`write`) 操作。这些基本的 I/O 操作允许应用程序直接处理底层的数据流而不必关心具体的设备特性[^2]。 ```c char buffer[BUFSIZ]; ssize_t n; n = read(fd, buffer, BUFSIZ - 1); if (n > 0) { buffer[n] = '\0'; // Null terminate the string printf("%s\n", buffer); } const char *msg = "Hello world!"; write(fd, msg, strlen(msg)); ``` #### 文件定位 除了简单的顺序读写外,还可以改变当前文件偏移量来实现随机访问。这是通过 `lseek` 实现的功能之一,它可以向前或向后移动文件指针的位置以便从不同的位置开始读写数据[^3]。 ```c off_t offset; offset = lseek(fd, SEEK_SET, 0); // Move to beginning of file if (offset != -1L) { // Seek succeeded. } ``` #### 特殊文件类型的支持 Unix 系统支持多种特殊类型的文件对象,比如管道、套接字以及终端设备等。本章还介绍了针对这些不同类型文件的具体 API 接口和支持机制[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值