使用信号量发生内存错误

使用信号量发生内存错误,第1张

你就一个信号量,而且两个线程都是先sem_wait,你的两个线程都会卡在sem_wait(&sem1)

你可以把其中给一个线程的sem_wait跟sem_post换个位置试一下

下,应该差不多

一、如何建立线程

用到的头文件

(a)pthread.h

(b)semaphore.h

(c) stdio.h

(d)string.h

定义线程标识

pthread_t

创建线程

pthread_create

对应了一个函数作为线程的程序段

注意的问题

要保证进程不结束(在创建线程后加死循环)

在线程中加入While(1)语句,也就是死循环,保证进程不结束。

二、控制线程并发的函数

sem_t:信号量的类型

sem_init:初始化信号量

sem_wait:相当于P操作

sem_post:相当于V操作

三、实现原形系统

父亲、母亲、儿子和女儿的题目:

桌上有一只盘子,每次只能放入一只水果。爸爸专放苹果,妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。分别用P,V操作和管程实现

每个对应一个线程

pthread_t father father进程

pthread_t mother mother进程

pthread_t son son进程

pthread_t daughter daughter进程

盘子可以用一个变量表示

sem_t empty

各线程不是只做一次,可以是无限或有限次循环

用While(1)控制各线程无限次循环

输出每次是那个线程执行的信息

printf("%s\n",(char *)arg)通过参数arg输出对应线程执行信息

编译方法

gcc hex.c -lpthread

生成默认的可执行文件a.out

输入./a.out命令运行

查看结果:程序连续运行显示出

father input an apple.

daughter get an apple.

mother input an orange.

son get an orange.

mother input an orange.

son get an orange.

………………..

四、程序源代码

#include <stdio.h>

#include<string.h>

#include <semaphore.h>

#include <pthread.h>

sem_t empty //定义信号量

sem_t applefull

sem_t orangefull

void *procf(void *arg) //father线程

{

while(1){

sem_wait(&empty)//P操作

printf("%s\n",(char *)arg)

sem_post(&applefull)//V操作

sleep(7)

}

}

void *procm(void *arg) //mother线程

{

while(1){

sem_wait(&empty)

printf("%s\n",(char *)arg)

sem_post(&orangefull)

sleep(3)

}

}

void *procs(void *arg) //son线程

{

while(1){

sem_wait(&orangefull)

printf("%s\n",(char *)arg)

sem_post(&empty)

sleep(2)

}

}

void *procd(void *arg) //daughter线程

{

while(1){

sem_wait(&applefull)

printf("%s\n",(char *)arg)

sem_post(&empty)

sleep(5)

}

}

main()

{

pthread_t father //定义线程

pthread_t mother

pthread_t son

pthread_t daughter

sem_init(&empty, 0, 1) //信号量初始化

sem_init(&applefull, 0, 0)

sem_init(&orangefull, 0, 0)

pthread_create(&father,NULL,procf,"father input an apple.") //创建线程

pthread_create(&mother,NULL,procm,"mother input an orange.")

pthread_create(&daughter,NULL,procd,"daughter get an apple.")

pthread_create(&son,NULL,procs,"son get an orange.")

while(1){} //循环等待

}

另外,站长团上有产品团购,便宜有保证

1、首先需要知道,μC/OS-II中创建任务的函数有两个: OSTaskCreate()和OSTaskCreateExt()

(1)OSTaskCreate() //创建普通任务

由于重点在下面的创建扩展任务函数,故本函数就不多说了!确实,要想实现检测目标任务栈实际使用情况的功能,是不能使用这个函数来创建目标任务的,必须使用OSTaskCreateExt() 。

(2)OSTaskCreateExt() //创建扩展任务

函数接口原型为:

#if OS_TASK_CREATE_EXT_EN >0

INT8U OSTaskCreateExt

(

void (*task)(void *pd), //建立扩展任务(任务代码指针

void *pdata, //传递参数指针

OS_STK *ptos, //分配任务堆栈栈顶指针

INT8U prio, //分配任务优先级

INT16U id, //(未来的)优先级标识(与优先级相同)

OS_STK *pbos, //分配任务堆栈栈底指针

INT32U stk_size, //指定堆栈的容量(检验用)

void *pext, //指向用户附加的数据域的指针

INT16U opt //建立任务设定选项

)

#endif

2、其次需要知道μC/OS-II中有这么个函数:OSTaskStkChk()

不错,检测任务堆栈实际使用情况正是用的这个函数,下面来本函数的接口原型:

INT8U OSTaskStkChk

(

INT8U prio, //待测任务的优先级

OS_STK_DATA *pdata //指向一个类型为OS_STK_DATA的结构体

)

3、再次需要知道一个结构体:

#if OS_TASK_CREATE_EXT_EN >0

typedef struct

{

INT32U OSFree//堆栈中未使用的字节数

INT32U OSUsed//堆栈中已使用的字节数

} OS_STK_DATA

#endif

参数: prio 为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的

信息。

pdata 指向一个类型为OS_STK_DATA的数据结构,其中包含如下信息:

INT32U OSFree// 堆栈中未使用的字节数

INT32U OSUsed// 堆栈中已使用的字节数


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/256021.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存