体育资讯网

您现在的位置是:首页 > 分类13 > 正文

分类13

pthread源码解析(pthread实现原理)

hacker2022-07-17 10:33:57分类13223
本文目录一览:1、请高手帮忙解释下这多线程的源代码,每句注释下#include#include

本文目录一览:

请高手帮忙解释下这多线程的源代码,每句注释下 #include #include

首先这是一个生产者和消费者问题。

生产者producer负责产生数据,然后通过put操作将数据放到缓冲区buf中。

消费者consumer负责显示数据,通过get操作从缓冲区buf中读取数据。

========》

先看主函数main(),

生产者和消费者分别用两个线程来实现。

主函数中的pthread_create()函数就是用来创建这两个线程的。

开始定义了两个变量th_a,th_b用来记录这两个线程的线程号。

线程的程序体分别是producer,consumer。

接下来的pthread_join用来等待两个线程结束。因为如果不等待,main函数的主线程会立即结束,而两个子线程还来不及完全执行。

=======》

下面来分别看producer,consumer这两个线程。

producer循环一百次,每次调用put往buffer中放数据,最后放一个OVER;

consumer循环用get从buffer中读到数据并打印,直到读取的数据位OVER数据时结束。

=======》

我们再分别来看put操作和get操作。

由于put和get都要访问buf,buf就是一个临界资源,为了解决这个临界资源,在使用buf之前,要对它加锁。

pthread_mutex_lock(b-lock)一个为信号量加锁的函数。每个信号量只能加锁一次(我说的可能不准确),如果执行该函数的时候,参数中的信号量已经被加锁,则该函数阻塞,直到信号量被解锁才继续执行。这样就能保证信号量所保护的临界资源能够被互斥的访问。

struct prodcons {

int buffer[BUFFER_SIZE];      /* 这个就是循环缓冲区*/

pthread_mutex_t lock;         /*这个是信号量,用来保证对缓冲区的互斥访问*/

int readpos, writepos;        /* 这两个成员分别表示读位置和写位置*/

pthread_cond_t notempty;      /* 这是表示缓冲区“非空”的条件信号量*/

pthread_cond_t notfull;       /* 这是表示缓冲区“非满”的条件信号量*/

};

buf是一个循环的缓冲区,我们先来看缓冲区为空和满这两种状态时,读、写标记(readpos,writepos)的位置。

缓冲区为空时,readpos 和writepos指在同一位置;

换从去为满时,writepos位置的下一个位置就是readpos。

/* put负责把数据放到缓冲区*/

void put(struct prodcons * b, int data)

{

//首先对互斥信号量进行加锁

pthread_mutex_lock(b-lock);

/* 这里就是判断缓冲区有没有满,用writepos+1与readpos比较,可以参考附图。

* 因为是循环缓冲区,所以要模BUFFER_SIZE 。

* 如果缓冲区满,将在while中等待,直到缓冲区非满,再继续执行。

*/

while ((b-writepos + 1) % BUFFER_SIZE == b-readpos) {

printf("wait for not full\n");

//如果已经满了,则等待消费者读取了数据后发出“非满”信号。

pthread_cond_wait(b-notfull, b-lock);

}

/* 当缓冲区非满时,将数据写入缓冲区中writepos对应的位置*/

b-buffer[b-writepos] = data;

//更新writepos到下一个位置

b-writepos++;

//循环利用缓冲区空间,如果超过了最大值,则从头开始。

if (b-writepos = BUFFER_SIZE) b-writepos = 0;

/* 向消费者发送信号,告诉消费者缓冲取非空 */

pthread_cond_signal(b-notempty);

//对互斥信号进行解锁。

pthread_mutex_unlock(b-lock);

}

/*--------------------------------------------------------*/

/* get负责从缓冲区中读取数据 */

int get(struct prodcons * b)

{

int data;

//对互斥信号量进行加锁

pthread_mutex_lock(b-lock);

/* 判断缓冲区是否为空,为空则等待*/

while (b-writepos == b-readpos) {

printf("wait for not empty\n");

pthread_cond_wait(b-notempty, b-lock);

}

/* 读取readpos位置的数据 */

data = b-buffer[b-readpos];

//更新readpos到下一个位置。

b-readpos++;

//循环利用缓冲区,回拨指针

if (b-readpos = BUFFER_SIZE) b-readpos = 0;

/* 发信号给生产者,缓冲区非满,可以放数据了*/

pthread_cond_signal(b-notfull);

//对互斥信号量进行解锁

pthread_mutex_unlock(b-lock);

return data;

}

gcc编译线程程序,为什么要加-lpthread,头文件已经包含了了啊

-lpthread是链接库,

pthread.h只有申明,实现部分都在库里面。

创建线程时一般是把函数的指针做参数,所以要加一个取地址符号。

ret=pthread_create(id,NULL,(void *)thread,NULL);

另外,建议要检查一下创建线程的返回值ret是否成功,防止影响后面的代码。

扩展资料:

每个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的原始码,并产生一抽象语法树,以及一翻译此语法树成为GCC的暂存器转换语言〈RTL〉的后端。

编译器最佳化与静态程序码解析技术(例如FORTIFY_SOURCE,一个试图发现缓冲区溢位〈buffer overflow〉的编译器)在此阶段应用于程序码上。最后,适用于此硬件架构的组合语言程序码以Jack Davidson与Chris Fraser发明的算法产出。

参考资料来源:百度百科-gcc

如何实现线程互等,线程2等待线程1结束后才继续执行。(可设置标志位) 求源代码

pthread_exit(NULL);

}

int main()

{

//初始化一个互斥锁

pthread_mutex_init(mut,NULL);

//创建A同学线程

pthread_create(thread[0], NULL,studentA,NULL);

//创建B同学线程

pthread_create(thread[1], NULL,studentB,NULL);

//等待A同学线程结束

pthread_join(thread[0],NULL);

//等待B同学线程结束

pthread_join(thread[1],NULL);

}

c编程中main函数中使用了库文件中定义的函数,编译时却提示该函数未定义,这是什么问题,坐等高手解答

原因:

头文件 pthread.h 没有包含到源文件中

解决方法:

1)将 pthread.h 复制到源文件相同的文件夹中

2)修改为:#include "pthread.h"

pthread.h不属于linux内核,但是为什么很多内核源码中include了pthread.h

加入头文件,是声明这个函数是被定义过的,就如同要使用stdio.h里的函数一样,没有stdio.h头文件,stdio.h里的函数一样不可用;使用#includepthread.h后,里面的函数就可以使用了,但是在编译的时候就需要加上"-lpthread",以方便程序去寻找lpthread.so共享库,例如:gcc abc.c -o abc -lpthread

对libpthread.so反汇编后怎么查看相应的源码

对libpthread.so反汇编后怎么查看相应的源码

1:先找出libpthread.so.0在那用whereis 命令

# whereis libphread.so.0

2:再用rpm -q查询

#rpm -qf libpthread.so.0的路径

3:知道属于哪个RPM包之后,挂载你的ISO 文件吧!假设你的ISO文件在/mnt/WinE下,准备挂载到/mnt/iso下

#mount -t iso9660 /mnt/WinE/xxxx.iso /mnt/iso/

4:去找那个RPM包吧,安装就OK了!

发表评论

评论列表

  • 颜于栖迟(2022-07-17 21:48:27)回复取消回复

    *)thread,NULL);另外,建议要检查一下创建线程的返回值ret是否成功,防止影响后面的代码。扩展资料:每个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码。全部的语言编译器都拥有共通的中介架