我正在运行Linux,我希望能够将并行函数调用到共享库(.so)中,遗憾的是它不是线程安全的(我猜它有全局数据结构).
出于性能原因,我不想简单地将函数调用包装在互斥锁中.
我想做的是产生4个线程,并将同一个库的4个副本加载到进程内存中.然后每个线程将函数调用到它自己的库副本中.
不幸的是,dlopen不允许我加载任何库的更多一个实例.
有谁知道任何允许我多次加载库的方法?(除了制作4个.so文件的副本,每个都有不同的名称)
我在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中寻找一种以编程方式(即,不使用命令行重定向)实现'tee'功能的方式,以便我的stdout同时转到stdout和日志文件.这需要适用于我的代码和输出到stdout的所有链接库.有什么办法吗?
我正在为嵌入式系统(dsPIC33平台)编写C代码,我正在考虑构建一个可重用的代码库,以便在多个项目中使用.
将库绑定到每个项目的最佳实践是什么?
显然,库将具有一些特定于硬件(因此特定于项目)的依赖关系,因此可以合理地假设它将与每个项目一起编译(而不是以二进制形式链接).
到目前为止我所提出的是保持库集中,但需要一个特定于项目的libraryConfig.h,其中包括函数定义,宏等.这要求库在其自己的代码中包含头,这意味着项目源目录需要在include路径中(而不仅仅是库源目录).那种食堂之间的区别#include ""和#include <>,不是吗?
这是正常的吗?
我一直对音频转换软件感到好奇,但我从来没有从初学者的角度看到如何编写一个简单的程序,例如将mp3文件转换为wav的正确解释.我不是在询问所涉及的任何复杂算法,只是使用简单库的一个小例子.搜索SO,我提出了几个名字,包括:
但我无法找到任何这些库的直接示例.通常我不介意涉及大量的代码,但在这里我完全不了解这个主题,所以我总觉得我在黑暗中拍摄.
这里的任何人都有一个关于使用这些库转换声音文件的简单示例/教程吗?我的问题专门针对C/C++,因为这些是我目前正在学习的两种语言,所以我想继续关注它们.
编辑:我忘了提一件事:我在*NIX系统上.
使用简单的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*更好吗?
我正在运行Ubuntu 9.10(Karmic Koala),我看了一下jmp_buf结构,它只是一个12个整数的数组.当我使用setjmp并传入jmp_buf结构时,12个条目中的4个被保存.这4个条目是堆栈指针,帧指针,程序计数器和返回地址.其他8个条目是什么?它们是机器相关的吗?段表基址寄存器的另一个条目是?还有什么需要正确恢复线程/进程的环境?我查看了手册页,其他来源,但我找不到汇编代码setjmp.
我经常看到如下代码,例如,在内存中表示一个大位图:
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)
这引出了两个问题:
谢谢.
在*nix上分析C/C++应用程序的最佳工具是什么?
(我希望能够分析一个混合了(阻塞)文件IO,epoll for network和fork()/ execv()的服务器来解决一些繁重的问题;但是一般的帮助和更一般的工具都很受欢迎.)
您是否可以在一个概述中获得RAM,CPU,网络和磁盘的大系统图片,并深入研究它?
在内核列表上有很多关于类似事情的讨论perf timechart,但我还没有发现Ubuntu中出现过任何问题.