小编Mom*_*gil的帖子

C:如何让线程相互通信?

有趣的是,这似乎是一个基本问题,但我找不到任何C语言的例子(在SO中,我发现只有Python,C#和C++).

关键是:作为一个Qt程序员,当我需要在不同的线程之间传输一些数据时,我会在那之间启动信号槽连接并使用该emit signal机制来完成工作.

但现在我在嵌入式Linux的C应用程序中工作,我需要做类似的工作,但我没有Qt的机制可用.问题是:我怎样才能使两个或多个线程在C中以类似于Qt信号和插槽的方式相互通信

我知道共享数据的方法之一是全局变量,其变量受互斥锁保护.但即便如此,我可能无法以异步方式执行系统:我必须有一个循环,不断检查变量是否已更改.但是,如果我想在另一个完成一些工作之后执行某个线程的特定方法(因此,以异步方式),该怎么办?然后它似乎失败了.

注意:虽然我使用的是嵌入式Linux,因此,提及一些可以采用POSIX功能和其他"Linux相关方式"的选项会有所帮助,如果有更多的时间用于解决方案,对社区来说仍然会更好.不严格基于某个特定平台(如果可能的话).

c linux multithreading pthreads

4
推荐指数
2
解决办法
3万
查看次数

如何使用 svn 获取给定存储库的 HEAD 修订号?

我想创建一个 Qt 应用程序,除其他外,它将显示特定存储库 URL 的当前修订号(即 HEAD 修订号)。在svn help这个这个链接的帮助下,我几乎可以通过调用命令来获得我想要的东西svn info <repository-url>。问题是这个命令返回了很多不需要的信息(例如“最后更改的作者”等),而我想要修订号(或尽可能少的文本)。

那么我该怎么做呢?

svn

4
推荐指数
1
解决办法
3445
查看次数

如何将指向另一个struct中声明的结构的指针作为函数参数传递?

在我用CI编写的一个应用程序中,有一个结构被声明为另一个结构的成员:

struct _test
{
    int varA;
    //...

    struct _small
    {
        int varB;
        //...
    } small;
} test;
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个访问varB上面的函数,但我不希望它访问整个结构test,也就是说,我不想这样做:

#include <relevant_header>

void myFunction()
{
    test.small.varB = 0;
}
Run Code Online (Sandbox Code Playgroud)

相反,我想只将small结构作为参数传递给该函数; 这样的事情:

#include <relevant_header>

void myFunction(struct _test::_small* poSmall)
{
    poSmall->varB = 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是我不知道怎么做,也就是说,上面的代码编译得不对(我想它只是C++语法).那么我怎样才能在C代码中执行此操作 - 将指针传递给在另一个struct中声明的结构?我无法在SO和Google中找到任何相关内容.

c parameters struct pointers function

2
推荐指数
1
解决办法
123
查看次数

C方法是否有可能无法包含在C++项目中?

我知道我可以使用这个extern "C"东西在C++项目中包含C方法.但现在让我们假设我正在考虑创建一个C++项目,该项目将使用来自我所创建的两个库以及其他人/公司制作的库的很多C方法,这些库的开发细节和编译规范我是根本不知道.

是否有可能这些C库的方法,包含未知的编译和配置细节,无法包含在我的C++项目中extern "C"?或者,所有C方法是否必须与C++代码100%兼容extern "C"

c c++ extern-c

1
推荐指数
1
解决办法
94
查看次数

"对齐陷阱"错误意味着什么?

我的一个朋友在尝试调试开始显示"对齐陷阱"错误的代码时遇到了一个大问题.当特定函数访问全局结构时,会发生此问题.

经过对网络的一些研究后,仍然不清楚"对齐陷阱"的含义是什么.有人可以给出一个解释,特别注意通常会导致对齐陷阱的问题以及解决问题的方法(不仅仅是关于如何使用调试器,还有问题本身)?

这一切都是在带有嵌入式Linux的ARM处理器(OMAP L138)的C代码中完成的.

注意:我不是试图通过这个答案获得特定于错误的解决方案建议,但正如问题标题所示,理解"对齐陷阱"错误意味着什么.这就是我不打算放置源代码等的原因.

c

1
推荐指数
1
解决办法
5737
查看次数

尝试运行Qt应用程序时LD_LIBRARY_PATH失败

我想在Linux上运行基于Qt 5的应用程序usind动态库.总之,脚本会将可执行文件和其他相关文件(包括lib文件夹中所有必需的.so)复制到所需目标,并且脚本调用gksudo将作为应用程序的调用者.

直到我调用可执行脚本直到现在一切正常:应用程序无法运行.当我要求运行时sudo,它告诉我库(Qt5SerialPort ...)丢失了.运行ldd实际的可执行文件我发现应用程序正在从lib文件夹中获取所需的库,但是一些明显的硬编码路径.

我尝试通过使用解决这个问题,qt.conf但没有成功.在这里注意,似乎qt.conf实际上并不应该以这种方式工作.咨询Qt文档,我决定用LD_LIBRARY_PATH链接器告诉链接器在哪里找到libs,因为我已经使用脚本来运行应用程序了.所以最终的,总结的脚本代码是

#!/bin/sh
LD_LIBRARY_PATH=lib/
export LD_LIBRARY_PATH
sudo ldconfig #sometimes  sudo /sbin/ldconfig -v
gksudo "$INSPATH/myApp" #or sudo instead
Run Code Online (Sandbox Code Playgroud)

问题是它仍然无法正常工作.当我打电话时echo $LD_LIBRARY_PATH,我可以看到变量被正确编辑,但当我调用运行行(使用sudo)时,它一直告诉我没有找到lib.

我错过了什么?

linux qt dynamic-linking dynamic-library qt5

1
推荐指数
1
解决办法
1438
查看次数

分析变量赋值的布尔结果是否有意义?

我刚才正在阅读代码,我发现另一个程序员编写了一个非常奇怪的代码行:

if ((socket_obj->client_fd = accept(socket_obj->server_fd, (struct sockaddr *)&socket_obj->client_address, &fromlen)) < 0)
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,该行正在调用返回整数值的socket.h函数accept.函数完成后,将该值赋值给socket_obj->client_fd然后,如果它低于0,则计算赋值操作.

但是它不会总是高于0,因为值赋值的布尔结果总是为真吗?我的意思是,以下行不会总是返回true吗?

if (myVariable = 0)
Run Code Online (Sandbox Code Playgroud)

我首先认为这是一个错误的编码并更改了代码所以首先发生赋值socket_obj->client_fd,然后内部的值被计算为0,但后来我在代码中找到了相同情况发生的另一个地方,所以我不能认为它是一个孤立的错误.

那么,我想知道我的解释是否正确.

c c++ boolean-operations assign

0
推荐指数
2
解决办法
69
查看次数

是否值得将局部变量设为静态以防止不断重新创建?

假设我有一个C/C++函数,它被频繁调用(假设它连接到一个超时至少每秒10次的定时器)并且该函数需要使用给定的变量/容器(整数或者字符串)或数组).现在,自然而然,在内存中创建此变量的过程会花费一些处理器时钟; 因此一次又一次地运行相同的功能意味着我将放弃相当多的"处理器时钟滴答",以便多次执行完全相同的操作.这可以通过使变量全局,函数类的成员或者static:在任何这种情况下,变量/容器只创建一次并且用于总是执行相同操作的许多"处理器时钟滴答"将被保存来防止.

我的问题是:这个操作真的值得吗(当谈到性能时)?换句话说,是将变量创建为全局,类的成员还是作为static改进(即使只是一点点)代码性能的实际方法,还是有其他可能轻易杀死任何可能改进的东西?(例如,static变量可能总是在堆上而不是在堆栈中创建,并且由于第一个变量比第二个变慢,这最终会破坏这种策略的性能)或者没有"全局规则"来了解事物因为它取决于许多具体问题,例如正在使用的处理器,编译器完成的优化以及变量/容器的类型,这样只有具有逐案研究的基准才能真正说明差异?

c c++ optimization performance

0
推荐指数
1
解决办法
119
查看次数