标签: c

加载共享库的多个副本

我正在运行Linux,我希望能够将并行函数调用到共享库(.so)中,遗憾的是它不是线程安全的(我猜它有全局数据结构).

出于性能原因,我不想简单地将函数调用包装在互斥锁中.

我想做的是产生4个线程,并将同一个库的4个副本加载到进程内存中.然后每个线程将函数调用到它自己的库副本中.

不幸的是,dlopen不允许我加载任何库的更多一个实例.

有谁知道任何允许我多次加载库的方法?(除了制作4个.so文件的副本,每个都有不同的名称)

c c++ linux shared-libraries thread-safety

12
推荐指数
2
解决办法
7992
查看次数

当用户在窗口外单击时,如何隐藏Gtk弹出窗口

我在C中使用GTK +和glade工具开发了一个弹出窗口(非装饰).当单击一个按钮时,它会在其父窗口中弹出.我想在用户点击此窗口时销毁或隐藏此弹出窗口.用户可以单击父窗口或任何其他窗口.我试图捕获GDK_FOCUS_CHANGE事件,但我无法捕获此事件.有没有办法实现这个目标?我怎么知道点击是在其他窗口然后弹出窗口?怎么清楚弹出窗口已经失去了它的焦点?所以我可以隐藏它.相关代码如下:

/*
 * Compile me with:

 gcc -o popup popup.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)
*/

#include <gtk/gtk.h>

static void on_popup_clicked (GtkButton*, GtkWidget*);
static gboolean on_popup_window_event(GtkWidget*, GdkEventExpose*);

int main (int argc, char *argv[])
{
    GtkWidget *window, *button, *vbox;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Parent window");
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    gtk_widget_set_size_request (window, 300, 300);
    gtk_window_set_position (GTK_WINDOW (window),GTK_WIN_POS_CENTER);

    button = gtk_button_new_with_label("Pop Up");
    g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (on_popup_clicked),(gpointer) window);

    vbox = gtk_vbox_new (FALSE, 3);
    gtk_box_pack_end(GTK_BOX …
Run Code Online (Sandbox Code Playgroud)

c gtk

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

如何在C中以编程方式实现"tee"?

我在C中寻找一种以编程方式(即,不使用命令行重定向)实现'tee'功能的方式,以便我的stdout同时转到stdout和日志文件.这需要适用于我的代码和输出到stdout的所有链接库.有什么办法吗?

c stdout tee

12
推荐指数
2
解决办法
6330
查看次数

可重用嵌入式C的最佳实践?

我正在为嵌入式系统(dsPIC33平台)编写C代码,我正在考虑构建一个可重用的代码库,以便在多个项目中使用.

将库绑定到每个项目的最佳实践是什么?

显然,库将具有一些特定于硬件(因此特定于项目)的依赖关系,因此可以合理地假设它将与每个项目一起编译(而不是以二进制形式链接).

到目前为止我所提出的是保持库集中,但需要一个特定于项目的libraryConfig.h,其中包括函数定义,宏等.这要求库在其自己的代码中包含头,这意味着项目源目录需要在include路径中(而不仅仅是库源目录).那种食堂之间的区别#include ""#include <>,不是吗?

这是正常的吗?

c embedded

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

绝对的初学者指导在C/C++中使用音频?

我一直对音频转换软件感到好奇,但我从来没有从初学者的角度看到如何编写一个简单的程序,例如将mp3文件转换为wav的正确解释.我不是在询问所涉及的任何复杂算法,只是使用简单库的一个小例子.搜索SO,我提出了几个名字,包括:

  • 综合工具包
  • OpenAL的
  • DirectSound的

但我无法找到任何这些库的直接示例.通常我不介意涉及大量的代码,但在这里我完全不了解这个主题,所以我总觉得我在黑暗中拍摄.

这里的任何人都有一个关于使用这些库转换声音文件的简单示例/教程吗?我的问题专门针对C/C++,因为这些是我目前正在学习的两种语言,所以我想继续关注它们.

编辑:我忘了提一件事:我在*NIX系统上.

c c++ audio

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

联合与无效指针

使用简单的void*而不是union的区别是什么?例:

struct my_struct {
    short datatype;
    void *data;
}

struct my_struct {
    short datatype;
    union {
        char* c;
        int* i;
        long* l;
    };
};
Run Code Online (Sandbox Code Playgroud)

这两个都可以用来完成完全相同的事情,虽然使用union或void*更好吗?

c unions

12
推荐指数
4
解决办法
5826
查看次数

Jmp_buf结构中的每个条目都有什么作用?

我正在运行Ubuntu 9.10(Karmic Koala),我看了一下jmp_buf结构,它只是一个12个整数的数组.当我使用setjmp并传入jmp_buf结构时,12个条目中的4个被保存.这4个条目是堆栈指针,帧指针,程序计数器和返回地址.其他8个条目是什么?它们是机器相关的吗?段表基址寄存器的另一个条目是?还有什么需要正确恢复线程/进程的环境?我查看了手册页,其他来源,但我找不到汇编代码setjmp.

c callstack longjmp

12
推荐指数
2
解决办法
8789
查看次数

#include iostream in C?

在C++中,我们始终将以下内容放在程序的顶部

#include <iostream>
Run Code Online (Sandbox Code Playgroud)

C怎么样?

c c++ iostream include

12
推荐指数
3
解决办法
6万
查看次数

现代处理器上的内存对齐?

我经常看到如下代码,例如,在内存中表示一个大位图:

size_t width = 1280;
size_t height = 800;
size_t bytesPerPixel = 3;
size_t bytewidth = ((width * bytesPerPixel) + 3) & ~3; /* Aligned to 4 bytes */
uint8_t *pixelData = malloc(bytewidth * height);
Run Code Online (Sandbox Code Playgroud)

(也就是说,一个位图被分配为一个连续的内存块,它bytewidth与一定数量的字节对齐,最常见的是4.)

然后通过以下方式给出图像上的一个点:

pixelData + (bytewidth * y) + (bytesPerPixel * x)
Run Code Online (Sandbox Code Playgroud)

这引出了两个问题:

  1. 对齐像这样的缓冲区会对现代处理器产生性能影响吗?我应该担心对齐,还是编译器会处理这个问题?
  2. 如果它确实有影响,有人可以指向我找到各种处理器的理想字节对齐的资源吗?

谢谢.

c memory performance memory-management alignment

12
推荐指数
2
解决办法
6064
查看次数

Linux上的性能分析

在*nix上分析C/C++应用程序的最佳工具是什么?

(我希望能够分析一个混合了(阻塞)文件IO,epoll for network和fork()/ execv()的服务器来解决一些繁重的问题;但是一般的帮助和更一般的工具都很受欢迎.)

您是否可以在一个概述中获得RAM,CPU,网络和磁盘的大系统图片,并深入研究它?

内核列表上有很多关于类似事情的讨论perf timechart,但我还没有发现Ubuntu中出现过任何问题.

c c++ unix linux performance

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