gpt4 book ai didi

c - 以 C 开头的 Pthread 函数

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:30 25 4
gpt4 key购买 nike

我实际上是进程、线程、信号量、IPC 等方面的新手(Linux 上不久的操作系统操作)......我的问题是我编译我的代码并且它只是卡在了如此有趣的地方。进程被执行,但是他们不能进入他们线程的功能。之后程序什么都不做直接结束。我真的无法弄清楚问题出在这里还是一切都有问题。我不知道。

#define _GNU_SOURCE
#include <sys/types.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>


void * function1(void *ptr)
{
printf("Function 1\n"); //!Test prints
printf("Index is %d",*((int *)ptr));
sleep(1);
pthread_exit(NULL);
}

void * function2(void *ptr)
{
printf("Function 2\n"); //!Test prints
printf("Index is %d",*((int *)ptr));
sleep(2);
pthread_exit(NULL);
}

int main(){
//...
int *index;
int i;
pid_t f;
int number_of_process=5;
pthread_t thread1, thread2;
//...

for(i=0; i<number_of_process; i++)
{
f=fork();
if(f==-1)
{
printf("Fork Error!!\n");
exit(1);
}
if(f==0) //To block child processes re-enter
{
*index = i; //I store index number for each process here. I'll need them in the thread functions
break;
}
}

/*******************PARENT PROCESS********************/
if(f!=0){
// wait for all children to exit
while (f = waitpid (-1, NULL, 0)){
if (errno == ECHILD)
break;
}
exit(0);
}

/*******************CHILD PROCESS*********************/
else{
pthread_create(&thread1,NULL,function1,(void *)index);
pthread_create(&thread2,NULL,function2,(void *)index);
}
}

最佳答案

Processes are executed, but they can't enter their threads' function. After that, program directly ends without doing something.

那是因为主线程(即 fork() 创建的子进程)不会等待线程完成它们的执行。所以它给你的印象是程序没有调用所有 pthread 函数就退出了。

使用pthread_join()创建线程后:

...
pthread_create(&thread1,NULL,function1,(void *)index);
pthread_create(&thread2,NULL,function2,(void *)index);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
...

由于没有任何同步的线程打印,输出可能会交错。

关于c - 以 C 开头的 Pthread 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com