我已经实现了两个程序(parent.cpp,child.c),它们应该通过信号进行通信,以交替方式无限期地工作。然而,由于某种原因,程序在随机的时间后进入死锁,我无法弄清楚为什么(发送给父进程的信号似乎在没有执行信号处理程序的情况下被丢弃;因此,两者都等待来自其他进程的信号)。
程序采取的步骤:首先,初始化父进程,生成子进程并等待子进程的初始化(参见LLVMFuzzerInitialize
parent.cpp)。然后,进入循环并在每次迭代中LLVMFuzzerTestOneInput
调用。这里,(1) 父进程将数据写入子进程的 stdin,(2) 通过 SIGUSR2 唤醒子进程,(3) 子进程处理数据,以及 (4) 通过 SIGUSR1 唤醒父进程。
在 Linux 上,parent
通常在几千次迭代后停止,而parent_main
在大多数运行中无限期地运行(尽管有时它也会在几千次迭代后停止)。在 Mac 上,这两个程序都会在几秒钟后停止。
下面是一个由parent.cpp、child.c 和 Makefile 组成的最小工作示例:
// parent.cpp
#include <cstdlib>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
static volatile sig_atomic_t signal_received = 0;
static pid_t child_pid = -1;
static int fdin[2], fdout[2];
void handleSIGUSR1(int signo, siginfo_t *info, void *context)
{
if (child_pid == info->si_pid)
signal_received = …
Run Code Online (Sandbox Code Playgroud) 我想在创建时用一些提取的数据(例如,使用数据库或网络请求)填充QTableView。因为请求需要一些时间-从而阻塞了GUI-我得出的结论是使用另一个线程进行提取。
我当前的设置如下所示(显然已简化):
class MyTable : public QTableView {
QFutureWatcher<QAbstractItemModel*>* watcher;
void init() {
watcher = new QFutureWatcher<QAbstractItemModel*>();
connect(watcher, SIGNAL(finished()), this, SLOT(onResult()));
watcher->setFuture(QtConcurrent::run(...))
}
void onResult() {
setModel(watcher->result());
}
}
Run Code Online (Sandbox Code Playgroud)
在将对象添加到GUI之后,将调用init()方法。因为我对C ++ / Qt /多线程还很陌生,所以我想问一下这段代码是否表现出预期的效果,或者是否会遇到某种竞争情况或类似情况。我特别担心onResult()方法,因为我担心“ setModel”可能不是线程安全的。