【发布时间】:2020-04-26 10:33:32
【问题描述】:
我现在正在尝试创建一个程序,其中多个线程正在查询需要处理然后写入磁盘的数据。目前我正在使用 pragma 和 pragma critical 以确保按预期写入数据。
这是相当昂贵的,因为线程必须相互等待。我读到应该可以让一个线程为您处理所有对磁盘的写入,而其他线程可以专注于获取传入的数据并对其进行解析。我该怎么做呢?
该程序是一个基于 XDP 的数据包解析器,它仅存储有关每个数据包的特定信息。代码基于这里的项目代码:https://github.com/xdp-project/xdp-tutorial/blob/master/tracing04-xdp-tcpdump/xdp_sample_pkts_user.c
static int print_bpf_output(void *data, int size)
{
struct {
__u16 cookie;
__u16 pkt_len;
__u8 pkt_data[SAMPLE_SIZE];
} __packed *e = data;
struct pcap_pkthdr h = {
.caplen = SAMPLE_SIZE,
.len = e->pkt_len,
};
struct timespec ts;
int i, err;
if (e->cookie != 0xdead) {
printf("BUG cookie %x sized %d\n",
e->cookie, size);
return LIBBPF_PERF_EVENT_ERROR;
}
err = clock_gettime(CLOCK_MONOTONIC, &ts);
if (err < 0) {
printf("Error with gettimeofday! (%i)\n", err);
return LIBBPF_PERF_EVENT_ERROR;
}
h.ts.tv_sec = ts.tv_sec;
h.ts.tv_usec = ts.tv_nsec / NANOSECS_PER_USEC;
if (verbose) {
printf("pkt len: %-5d bytes. hdr: ", e->pkt_len);
for (i = 0; i < e->pkt_len; i++)
printf("%02x ", e->pkt_data[i]);
printf("\n");
}
pcap_dump((u_char *) pdumper, &h, e->pkt_data);
pcap_pkts++;
return LIBBPF_PERF_EVENT_CONT;
}
这个函数将被许多线程调用,我希望 pcap_dump 调用由一个不同的线程执行。
【问题讨论】:
-
这太宽泛了.. 完全取决于您的程序的体系结构以及它需要做什么。每当您有多个线程访问相同的数据时,这些访问都需要同步,否则您将遇到竞争条件。
-
我已经编辑了这个问题,增加了更多的特异性,包括一个指向相关代码的链接。
标签: c linux multithreading io pthreads