如何在c下的linux fedora中实现多线程单进程模型,其中单个调度程序用于“主”核心读取i / o可用性(例如tcp / ip,udp)然后具有单线程 - 每个核心(从init开始),“执行线程”,解析数据然后将少量信息更新更新到共享内存空间(我理解pthreads在单个进程下共享数据)。
我相信我的选择是:
Pthreads或Linux OS调度程序
我有一个天真的模型,包括在一个调度程序线程中启动一定数量的这些执行线程。
当我知道我可以使用这种模型时,可以想到的最佳解决方案是什么。
答案 0 :(得分:1)
修改Linux调度程序是一项非常艰巨的工作。我会忘记它。 Pthread通常是首选。如果我理解得很好,您希望有一个专用于控制计划的核心,以及一个专门用于数据计划处理的其他核心池?然后从主线程创建一个线程池,并使用pthread_setaffinity_np(...)
为这些从属线程设置核心关联。
事实上,进程的线程共享相同的地址空间,并且该进程的任何线程都可以访问全局变量。
答案 1 :(得分:1)
完成Benoit的回答,为了在主线程和工作线程之间进行通信,您可以使用条件变量。工人做的事情如下:
while (true)
{
pthread_mutex_lock(workQueueMutex);
while (workQueue.empty())
pthread_cond_wait(workQueueCond, workQueueMutex);
/* if we get were then (a) we have work (b) we hold workQueueMutex */
work = pop(workQueue);
pthread_mutex_unlock(workQueueMutex);
/* do work */
}
和主人:
/* I/O received */
pthread_mutex_lock(workQueueMutex);
push(workQueue, work);
pthread_cond_signal(workQueueCond);
pthread_mutex_unlock(workQueueMutex);
这会唤醒一个空闲工作以立即处理请求。如果没有工人可用,工作将被出列并稍后处理。
答案 2 :(得分:0)
在我看来,你有一个producer-consumer problem版本,只有一个消费者聚合了n
个生产者的结果。这是一个非常标准的问题,所以我绝对认为pthread
对你来说已经足够了。你不需要去调度程序。
作为答案的状态之一,像here所描述的线程安全队列可以很好地解决这类问题。你最初产生一堆线程的想法是个好主意。您似乎担心线程共享全局状态的能力会导致您出现问题。如果你将共享状态保持在最低限度并使用理智的锁定规则,我认为这不是问题。只要你负责任地分享国家就可以了。
最后,除非你真的知道你在做什么,否则我建议不要手动搞乱线程亲和力。只是生成线程并让调度程序处理线程运行的核心和核心。要优化的是您使用的线程数。如果其他线程正在运行,则每个核心一个实际上可能不是最快的方法。
答案 3 :(得分:0)
一般来说,这或多或少正是posix select
和linux特定epoll
函数的用途。