在Linux中, 做所有types的进程间通信是否需要系统调用? 进程间通信types如 Pipes Signals Message Queues Semaphores Shared Memory Sockets 所有types的线程间通信都需要系统调用吗? 我想知道所有进程间通信和线程间通信是否涉及从用户模式切换到内核模式,以便内核运行来执行通信? 由于系统调用都涉及这样的切换,所以我询问通信是否需要系统调用。 例如,“共享内存”可以用于进程间和线程间通信,但是我不确定是否需要系统调用或操作系统内核的参与来接pipeCPU来执行某些操作。 谢谢。
主要问题是:我们如何等待Linux内核中的一个线程完成? 我已经看到了一些关于在Linux内核中处理线程的正确方法,但我不确定我们如何等待主线程中的单个线程完成(假设我们需要线程[3]完成,然后继续): #include <linux/kernel.h> #include <linux/string.h> #include <linux/errno.h> #include <linux/sched.h> #include <linux/kthread.h> #include <linux/slab.h> void *func(void *arg) { // doing something return NULL; } int init_module(void) { struct task_struct* thread[5]; int i; for(i=0; i<5; i++) { thread[i] = kthread_run(func, (void*) arg, "Creating thread"); } return 0; } void cleanup_module(void) { printk("cleaning up!\n"); }
我有以下数据: number1 I am writing line1 . number2 First line . number3 I am writing line2. number4 Second line . number5 I am writing line3 . number6 Third line. number7 I am writing line2 . number8 Fourth line . number9 I am writing line5 . number10 Fifth line . 现在我想从这个文本文件中删除重复的行 – 与此一起,我想删除重复行的前一行和后一行。 这样,删除后我的数据如下所示: number1 I […]
我想实现一个multithreading进程,它负责并行启动线程。 根据htop的输出结果,每个线程的CPU消耗不到1%,而主CPU消耗100%的CPU。 int main (int argc, char *argv[]) { struct sigaction action; int i; exitReq = 0; memset(&engine, 0, sizeof(stEngine_t)); engine.NbTasks = 12; engine.TaskThread = malloc(engine.NbTasks * sizeof(stTask_t)); /* NbTasks = 12 */ for (i = 0; i < engine.NbTasks; i++) { engine.TaskThread[i] = array[i]; engine.TaskThread[i].initTask(); pthread_create(&engine.TaskThread[i].tId, NULL, my_handler, (void *) &engine.TaskThread[i]); } while (!exitReq) […]
注意:我删除了以下代码片段中所有需要的错误检查。 … void *thread_function(void *arg) { … pthread_exit("Hello"); } pthread_t a_thread; void *thread_result; pthread_create(&a_thread, NULL, thread_function, NULL); pthread_join(a_thread, &thread_result); /* int pthread_join(pthread_t th, void **thread_return); The second argument is a pointer to a pointer that itself points to the return value from the thread. int pthread_exit(void *retval); This function terminates the calling thread, returning a […]
我正在Linux CentOS服务器上编程一个网站(我打算升级到一个VPS计划,我将拥有root权限)。 大部分网站将依靠自动化的脚本。 我有两个有关启动自动化stream程的问题。 有没有什么办法可以启动一个守护进程线程,或类似的东西,这将不断运行。 每次电子邮件帐户收到新电子邮件时,我都需要执行脚本。 我知道每分钟都可以运行的cron作业,但是有一个经常运行的脚本将是理想的,所以我可以在新的电子邮件到达的时候执行脚本。 有没有什么办法从代码(理想的PHP)启动一个线程,与主程序同时运行。 在我使用的脚本中,imap_open用于连接到一个电子邮件帐户,每次需要几秒钟。 但是,如果我可以同时触发多个并发脚本,那么理想情况下会减less程序的时间。 有没有办法做到这一点? 任何帮助这些问题将不胜感激。
In [19]: threading.currentThread().ident Out[19]: 139639576676096 139639576676096是我在mysql CENTOS框中的线程ID。 可以吗? 为什么线程ID变得如此之大?
我有几个与线程和进程调度有关的查询。 当我的进程进入hibernate状态并唤醒时,是否总是将它安排在与之前预定的CPU相同的CPU上? 当我从这个进程创build一个线程时,它是否也会一直在同一个CPU上执行? 即使其他CPU是空闲和睡眠。 我想知道在Linux中的具体机制。 另外我通过pthread库创build线程。 我面临一个始终不可重现的随机挂断问题。 需要这些信息才能朝着正确的方向前进。
我有两个在Ubuntu中构build的C ++程序,我想同时运行它们。 我不想把它们合并成一个C ++项目,并在不同的线程上运行,因为这会导致我所有的问题。 我想要效仿的解决scheme是在terminal中打开两个选项卡,并在单独的选项卡中运行每个程序。 但是,我也想要一个程序(我们称之为程序A)能够退出并重新运行另一个程序(程序B)。 这在terminal上是无法实现的。 所以我想要做的是在程序A中编写一些C ++代码,可以随时运行和退出程序B. 这两个程序必须同时运行,以便程序A不必等到程序B返回之后再继续程序A. 有任何想法吗? 谢谢!
编辑:我已经find了单例的构造函数被调用多次,所以它似乎是不同类加载器不止一次地加载类。 我如何在Tomcat中创build全局单例? 我一直在使用Google,但目前还没有运气。 我有一个单例对象,我这样构造: private static volatile KeyMapper mapper = null; public static KeyMapper getMapper() { if(mapper == null) { synchronized(Utils.class) { if(mapper == null) { mapper = new LocalMemoryMapper(); } } } return mapper; } 类KeyMapper基本上是一个HashMap的同步包装,只有两个函数,一个是添加一个映射,一个是删除映射。 当我在32位Windows机器上运行Tomcat 6.24时,一切正常。 然而,当在64位的Linux机器上运行(CentOS 5.4和OpenJDK 1.6.0-b09)时,我添加一个映射并打印出KeyMapper使用的HashMap的大小来validation添加的映射(即validation大小= 1)。 然后我尝试检索另一个请求的映射,我一直得到空,当我检查的HashMap的大小为0我相信映射不会意外地被删除,因为我已经注释掉所有调用删除(我不使用清除或任何其他mutators,只是得到和放)。 请求正在通过Tomcat 6.24(configuration为使用至less4个线程的200个线程),并且将-Xnoclassgc传递给了jvm,以确保该类不会无意中被垃圾收集(jvm也以-server模式运行)。 我还为KeyMapper添加了一个finalize方法,如果它被垃圾收集来validation它没有被垃圾回收,就打印到stderr。 我在我的智慧结束,我无法弄清楚为什么一分钟HashMap中的条目在那里,下一个不是:(