C 在fork之后创建pthread

C 在fork之后创建pthread,c,sockets,pthreads,fork,C,Sockets,Pthreads,Fork,我正在编写一个C程序,一旦它接受客户机连接,它就会分叉。一旦发生这种情况,我想产生两个线程,但我似乎无法让它工作 pthread_t t1, t2; void *r_loop(); void *w_loop(); . . . sockfd = accept(r_sockfd, (struct sockaddr *) &address, &len); if (sockfd < 0) printf("Error acce

我正在编写一个C程序,一旦它接受客户机连接,它就会分叉。一旦发生这种情况,我想产生两个线程,但我似乎无法让它工作

    pthread_t t1, t2;
    void *r_loop();
    void *w_loop();
    .
    .
    .

sockfd = accept(r_sockfd, (struct sockaddr *) &address, &len);
if (sockfd < 0)
    printf("Error accepting\n");

if (!fork())
{
    int r_thread = pthread_create(&t1, NULL, r_loop, NULL);
    int w_thread = pthread_create(&t2, NULL, w_loop, NULL);

    pthread_join(r_thread, NULL);
    pthread_join(w_thread, NULL);
    exit(0);
}
pthread_t t1,t2;
void*r_loop();
void*w_loop();
.
.
.
sockfd=accept(r_sockfd,(struct sockaddr*)和地址,&len);
if(sockfd<0)
printf(“错误接受\n”);
如果(!fork())
{
int r_thread=pthread_create(&t1,NULL,r_循环,NULL);
int w_thread=pthread_create(&t2,NULL,w_循环,NULL);
pthread_join(r_线程,NULL);
pthread_join(w_thread,NULL);
出口(0);
}

当我运行这个函数时,不会执行函数r\u loop和w\u loop。

问题可能是:pthread\u create()on success总是返回零。您正在向pthread_join()传递一个不正确的值(即零而不是t1和t2),使它们立即返回。然后,下面的exit()也会杀死新的开始线程

您应该传递
t1
t2
,而不是
r\u thread
w\u thread
pthread\u join()
,函数需要声明为
void*(void*)
。提示:始终测试API调用的返回值是否有错误。错误代码是您的朋友。您正在使用Linux/glibc吗?关于pthreads的实现,一件令人沮丧的事情是
pthread\u t
被定义为
long
(尽管它实际上存储了一个指针),这意味着编译器无法捕获这样的错误。如果
pthread\u t
被定义为
struct\uuu pthread\u struct*
或类似类型,编译器将抛出一条信息非常丰富的错误消息。