如何在c下的linux fedora中实现多线程单进程模型,其中单个调度器用于“主”核心读取i/o可用性(例如,tcp/ip,udp),然后有一个每个核心的单线程(从init开始),“执行线程”,解析数据,然后更新少量的信息更新到共享内存空间(我的理解是pthread在单个进程下共享数据)。
我相信我的选择是:
Pthread或linux OS调度程序
我在脑海中有一个朴素的模型,由启动一定数量的执行线程和单个调度程序线程组成。
当我知道我可以使用这种模型时,人们能想到的最佳解决方案是什么?
发布于 2012-06-08 18:43:42
完成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);这将唤醒一个空闲的工作,以立即处理请求。如果没有工作进程可用,该工作将被出队并在稍后进行处理。
发布于 2012-06-08 18:31:44
修改Linux调度器是一项相当困难的工作。我就忘了这件事。Pthread通常是首选的。如果我理解得很好,您希望有一个专门用于控制计划的核心,以及一个专门用于数据计划处理的其他核心池吗?然后从您的主线程创建一个线程池,并使用pthread_setaffinity_np(...)为这些从线程设置核心亲和性。
事实上,一个进程的线程共享相同的地址空间,并且该进程的任何线程都可以访问全局变量。
发布于 2012-06-08 19:17:11
在我看来,您有一个只有一个消费者的producer-consumer problem版本,它聚合了n生产者的结果。这是一个非常标准的问题,所以我绝对认为pthread对您来说已经足够了。你不需要去摆弄调度器。
作为答案的一种状态,像here描述的线程安全队列很好地解决了这类问题。你最初的想法是产生一堆线程,这是一个好主意。您似乎担心线程共享全局状态的能力会给您带来问题。我不认为这是一个问题,如果您将共享状态保持在最低限度,并使用合理的锁定规则。只要你负责任地这样做,共享状态就很好。
最后,除非您真的知道自己在做什么,否则我建议不要手动处理线程亲和性。只需生成线程并让调度程序处理线程何时在哪个内核上运行即可。需要优化的是你使用的线程的数量。如果其他线程正在运行,则每个内核一个线程实际上可能不是最快的方法。
https://stackoverflow.com/questions/10877039
复制相似问题