Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >线程函数内函数中的信号量值不一致

线程函数内函数中的信号量值不一致
EN

Stack Overflow用户
提问于 2019-03-12 23:45:29
回答 1查看 160关注 0票数 2

我一直在学习如何使用pthreads和互斥锁,并对以下C代码的输出感到困惑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>

void *TestThread(void *);
void TestFunc();

sem_t mutex;

int main(int argc, char *argv[]) {
    pthread_t tid;
    sem_init(&mutex, 1, 0);
    pthread_create(&tid, NULL, TestThread, NULL);
    pthread_join(tid, NULL);
}

void *TestThread(void *arg) {
    int val;
    sem_getvalue(&mutex, &val);
    printf("value of mutex in Thread function: %d\n", val);
    TestFunc();
    pthread_exit(NULL);
}

void TestFunc() {
    int val;
    sem_getvalue(&mutex, &val);
    printf("value of mutex in function in Thread function: %d\n", val);
}

然后我像g++ -lpthread mutexTest.c -o mutexTest一样编译它,并用./mutexText运行,它给出并输出如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
value of mutex in Thread function: 0
value of mutex in function in Thread function: 1754151134

为什么我在线程内调用的函数中的mutex值发生了变化?不知何故,我丢失了对互斥锁的引用?

EN

回答 1

Stack Overflow用户

发布于 2019-03-13 00:40:53

我不知道你的代码为什么会失败。不幸的是,就我们目前的目的而言,您的代码在我的机器上是成功的。

在其他人发布正确的答案之前,如果你想和我一起尝试一些调试想法,在你的选择下,我们可以尝试以下方法。

试试@AndrewHenle的建议:“在这两种情况下,sem_getvalue()返回的是什么?如果它返回的是非零,那么errno是什么?”

作为参考,在我的机器上(Debian GNU/Linux9,GCC 6.3,Pthreads2.24),它返回零,errno也是零。

试着改变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sem_t mutex;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
volatile unsigned char buffer_before_mutex[0x1000];
sem_t mutex;
volatile unsigned char buffer_after_mutex[0x1000];

原因:如果有什么东西在堆栈上覆盖了你的互斥锁,这可能会给它留出一些空闲的空间来覆盖它,而不是破坏互斥锁。即使它能工作(我怀疑它不能工作),它也不会是正确的;但是它可能提供关于您的代码出了什么问题的线索。

(我的回答可能已经被评论取代了。我在这里留下了答案,以防其中的一部分被证明是有用的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55132323

复制
相关文章
【数字信号处理】相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )
本篇博客中的 互相关函数 和 自相关函数 , 都是 " 能量信号 " 的 相关函数 ;
韩曙亮
2023/03/30
9830
【数字信号处理】相关函数 ( 功率信号 | 功率信号的互相关函数 | 功率信号的自相关函数 )
本篇博客中的 互相关函数 和 自相关函数 , 都是 " 功率信号 " 的 相关函数 ;
韩曙亮
2023/03/30
1.5K0
qt中connect函数信号写法_qt中connect函数用法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193303.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
5180
【数字信号处理】相关函数 ( 周期信号 | 周期信号的自相关函数 )
信号 根据 " 周期性 " 进行分类 , 可以分为 " 周期信号 " 和 " 非周期信号 " ;
韩曙亮
2023/03/30
1.3K0
【数字信号处理】相关函数 ( 有限信号 | 有限信号的自相关函数 )
有限信号 是 能量信号 , " 自相关函数 " 的 " 傅里叶变换 " 是 " 功率谱密度函数 " ,
韩曙亮
2023/03/30
7230
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 | 在白噪声中检测正弦信号 )
文章目录 一、正弦信号 的 自相关函数 分析 一、正弦信号 的 自相关函数 分析 ---- 正弦信号 A \sin \omega n , 其 幅度 A = 1 , 功率 P_s = 0.5 , 下图是该正弦信号的函数图 : 白噪声信号 N(n) , 方差 1 , 信噪比 \rm SNR = -3dB , 信号长度为 512 ; 下图是 正弦信号 s(n) = A \sin \omega n 与 白噪声信号 N(n) 叠加后的 函数图 : 从上图中 , 基本看不
韩曙亮
2023/03/30
1.9K0
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 | 在白噪声中检测正弦信号 )
Qml信号绑定函数
使用Qml中的信号绑定函数。 步骤 定义信号 signal mySignal(); 定义需要绑定的函数 functionfunc(); 连接信号到函数 functionfunc(); 触发信号 onClicked:root.mySignal()。 示例 Rectangle { width: 100; height: 100 signal mySignal(); Component.onCompleted: mySignal.connect(func) function f
Qt君
2019/07/15
1.6K0
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 二 | 在白噪声中检测正弦信号 )
从上图中 , 可以大概分辨出信号 , 比上一篇博客 【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 | 在白噪声中检测正弦信号 ) 中 , 叠加后的信号 明显很多 , 下图是上一篇博客中叠加后的信号 :
韩曙亮
2023/03/30
1.4K0
【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 二 | 在白噪声中检测正弦信号 )
【数字信号处理】相关函数应用 ( 相关函数应用场景 | 噪声中检测信号原理 )
, 求该信号的自相关函数 , 由于都是 实型号 , 不存在共轭 , 式子变为 :
韩曙亮
2023/03/30
6900
【数字信号处理】相关函数 ( 相关函数性质 | 相关函数共轭对称性质 | 实信号自相关函数偶对称 | 复信号自相关函数共轭对称 | 复信号互相关函数共轭对称 )
文章目录 一、相关函数共轭对称性质 1、实信号自相关函数偶对称 2、复信号自相关函数共轭对称 3、复信号互相关函数共轭对称 一、相关函数共轭对称性质 ---- 1、实信号自相关函数偶对称 实信号 自相关函数 偶对称 : 描述 : x(n) 信号如果是 " 实信号 " , 则 自相关函数 是 偶对称 的 ; 物理意义 : 给定一个 " 实信号 " x(n) , 该信号 向左移动 m 和 向右移动 m , 与 原信号 x(n) 的 自相关函数 值 是相同的 ; 2、复信号自相关
韩曙亮
2023/03/30
1.1K0
Linux信号种类与函数
要对一个信号进行处理(除了无法捕捉的SIGKILL和SIGSTOP),需要为其注册相应的处理函数,通过调用signal()函数可以进行注册。
xxpcb
2020/08/04
3K0
用回调函数调用异步流回调函数内的数据
本文的标题看起来也许比较绕,看不懂也没关系,后面会慢慢说明。写这篇文章是为了记录一下前几天我碰到的一个问题。
凌虚
2020/07/18
1.9K0
用回调函数调用异步流回调函数内的数据
在vue中的html标签{{}}内可以调用函数方法
今天领导提个需求,要求在金额上强制保留两位小数,本想着后台直接返回数据时,带着两位的小数,前端只是做个显示作用,后台说保留了小数但在传输过程中去掉了,可能他们做了格式转化。没办法了只能又是我们前端操作了,牵扯价钱的太多了,很多时候又有for 循环,怎么办呢?
honey缘木鱼
2019/02/26
30.9K0
L007Linux信号、信号处理和信号处理函数
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据。
上善若水.夏
2018/09/28
4.2K0
创建函数/类的线程
# 创建类的线程 import threading import time class MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = "我是[线程]" + self.name + '@' + str(i) print(msg) if __name__ == "__main__":
py3study
2020/01/17
8890
【数字信号处理】相关函数 ( 自相关函数示例 )
参考 【数字信号处理】相关函数 ( 周期信号 | 周期信号的自相关函数 ) 博客 ;
韩曙亮
2023/03/30
6370
Linux信号量及函数
信号量,或称信号灯,其原理是一种数据操作锁的概念,本身不具备数据交换的功能,它负责协调各个进程,保证保证两个或多个关键代码段不被并发调用,确保公共资源的合理使用。信号量分为单值和多值两种。
xxpcb
2020/08/04
2.1K0
day41(多线程) - 守护线程、信号量、递归锁、队列、事件、线程池、线程池的回调函数
# 不同的进程在不同的函数内做自己的事儿 # 线程先后顺序不随机 # 谁先拿到第一把锁,则其他的锁都会全部先给第一个拿到第一把锁的人 # 需要多把锁的时候,防止出现 A 一把锁,B 一把锁 造成全局的死锁
少年包青菜
2019/08/03
6150
点击加载更多

相似问题

线程内的Asyncio函数

218

函数内的Javascript设置变量值

14

检查内联函数内的变量值

10

更新OnStart()函数内的变量值

118

在函数内启动线程

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文