XRender 在 Linux 的多线程处理
一 线程安全与总体原则
二 常见多线程架构
三 实践要点与性能建议
四 最小示例 共享 Display 加锁
#include <pthread.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <stdio.h>
#include <stdlib.h>
static Display *g_dpy = NULL;
static pthread_mutex_t g_mtx = PTHREAD_MUTEX_INITIALIZER;
void* worker(void *arg) {
int tid = *(int*)arg;
pthread_mutex_lock(&g_mtx);
// 示例:获取根窗口并创建一个 ARGB32 的 Picture(仅演示,不做实际绘制)
Window root = DefaultRootWindow(g_dpy);
XRenderPictureAttributes pa = {0};
Picture pic = XRenderCreatePicture(g_dpy, root, PictStandardARGB32, &pa, 0);
if (!pic) {
fprintf(stderr, "Thread %d: XRenderCreatePicture failed.\n", tid);
} else {
// TODO: 实际的 XRenderComposite 等操作
XRenderFreePicture(g_dpy, pic);
}
pthread_mutex_unlock(&g_mtx);
return NULL;
}
int main(int argc, char **argv) {
g_dpy = XOpenDisplay(NULL);
if (!g_dpy) { fprintf(stderr, "Cannot open display\n"); return 1; }
// 可选:检查 XRender 扩展
if (!XRenderQueryExtension(g_dpy, NULL, NULL)) {
fprintf(stderr, "XRender extension not available\n");
return 1;
}
const int N = 4;
pthread_t threads[N];
int tids[N];
for (int i = 0; i < N; ++i) {
tids[i] = i;
if (pthread_create(&threads[i], NULL, worker, &tids[i]) != 0) {
perror("pthread_create");
exit(1);
}
}
for (int i = 0; i < N; ++i) pthread_join(threads[i], NULL);
XCloseDisplay(g_dpy);
return 0;
}