C 语言中的多线程与多处理



>我正在尝试学习多处理以及与多线程相比它是如何工作的。我很难找到它的利用率的良好来源,并且想知道是否有人可以给我一些与多线程相比的例子。

为了练习,我想我会尝试用线程编写代码,然后用进程编写代码。我坚持的是弄清楚如何创建我想要的进程,关闭进程,并使用互斥锁锁定/解锁进程。

例如,如果我想在一个函数中创建 5 个线程,我可以这样做:

for(i = 0; i < 5; i++) {
pthread_create(&(myThread[i]), NULL, myFunction, argument); 
}

我将如何在流程中执行此操作?我考虑过调用一个函数,然后在函数中调用 fork,但我不确定如何获得一个特定的数字。例如,如果我这样做:

myFunction(argument) {
fork();
fork();
fork();
...
}

那会给我 8 个整个过程。太多了。但是如果我删除一个 fork(),我总共会有 4 个进程,这太少了。我将如何创建任意数量的流程?

接下来,如果我要关闭线程,我只会这样做:

for(i = 0; i < 5; i++){
pthread_join(myThread[i],NULL);
}

但是,对于流程,我将如何做到这一点呢?

最后,为了保证线程安全,我可以在需要时使用互斥锁和呼叫锁解锁。

static pthread_mutex_t my_mutex;
pthread_mutex_lock(&my_mutex);
...
pthread_mutex_unlock(&my_mutex);

我可以在进程中使用互斥体吗?如果没有,还有什么选择?如果是这样,它的实现会有什么不同?

调用fork时应测试返回值。例如:

for (int i = 0; i < 4; ++i)
{
pid_t child = fork();
if(pid == -1) perror("wtf? "), abort(); // failed!
if(!pid) {
// in child process ...:
do_work();
exit(0);
}
}

-1返回值表示错误,而0表示你在子进程内。

如果您在子流程中,请中断循环,或者在退出流程之前继续执行一些工作。

请注意,不需要互斥锁管理,因为父进程和子进程不共享相同的内存。这也意味着它们需要以其他方式进行通信(通常使用管道、unix 套接字或特殊分配的共享内存)。

我将如何创建任意数量的进程?

使用exec系列的 API。

但是,对于流程,我将如何做到这一点呢?

wait将阻止当前进程,直到子进程退出。

相关内容

  • 没有找到相关文章

最新更新