pthread_create 和fork区别
时间: 2023-11-16 17:59:36 浏览: 50
pthread_create和fork都可以用于创建新的进程或线程,但它们之间有几个重要的区别:
1. fork()创建的是一个新的进程,而pthread_create()创建的是一个新的线程。
2. fork()会复制父进程的所有资源,包括内存、文件描述符等,而pthread_create()创建的线程会共享父线程的资源。
3. fork()返回新进程的PID,而pthread_create()返回0或错误码。
4. 在使用fork()时,父进程和子进程是完全独立的,它们之间的通信需要使用IPC机制,而使用pthread_create()创建的线程之间可以直接共享内存等资源,通信更加方便。
相关问题
pthread_create_wrapper
根据提供的引用内容,我们可以得知`pthread_create_wrapper`是一个函数的名称,该函数用来创建线程。在引用中,报错信息显示`undefined reference to pthread_create`,这意味着编译器无法找到`pthread_create`函数的定义。通常情况下,需要在代码中引入`pthread`库来解决这个问题,这也可以在引用中看到。在这个例子中,使用了`target_link_libraries(cpp_thread pthread)`来链接`pthread`库。
至于具体的`pthread_create_wrapper`函数的实现细节,由于引用内容中没有给出相关信息,我无法提供更多具体的解答。你可能需要查看你的代码,以确定`pthread_create_wrapper`函数是如何被定义和使用的。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [cmake undefined reference to `pthread_create](https://blog.csdn.net/sexyluna/article/details/123529290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [编写程序测量 pthread_create、fork 两个函数的运行时间,并进行实测比较](https://blog.csdn.net/enjoy_code_/article/details/105745101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘pthread_t’
这个警告是因为使用了错误的格式说明符。在使用 printf() 函数输出 pthread_t 类型的变量时,应该使用 %lu 格式说明符,而不是 %u。因此,将代码中的 printf() 函数中的 %u 替换为 %lu 即可解决该警告。修改后的代码如下:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void *func1() {
printf("i am a thread, threadId: %lu\n", pthread_self());
}
int main(int argc, char *argv[]) {
int pid1, pid2, pid3;
pthread_t tid1, tid2, tid3, tid4, tid5, tid6, tid7, tid8;
pid1 = fork();
switch (pid1) {
case 0:
pid2 = fork();
switch (pid2) {
case 0:
printf("i am a process, pid: %d\n", getpid());
pthread_create(&tid1, NULL, func1, NULL);
pthread_create(&tid2, NULL, func1, NULL);
break;
default:
printf("i am a process, pid: %d\n", getpid());
pthread_create(&tid3, NULL, func1, NULL);
pthread_create(&tid4, NULL, func1, NULL);
// exit(0);
break;
}
default:
pid3 = fork();
switch (pid3) {
case 0:
printf("i am a process, pid: %d\n", getpid());
pthread_create(&tid5, NULL, func1, NULL);
pthread_create(&tid6, NULL, func1, NULL);
break;
default:
printf("i am a process, pid: %d\n", getpid());
pthread_create(&tid7, NULL, func1, NULL);
pthread_create(&tid8, NULL, func1, NULL);
// exit(0);
break;
}
}
return 0;
}
```
需要注意的是,pthread_t 类型的变量本质上是无符号长整型(unsigned long),因此使用 %lu 格式说明符可以保证输出正确。