加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 螺纹和叉子

发布时间:2020-12-16 07:05:45 所属栏目:百科 来源:网络整理
导读:我对线程和分叉比较新.所以为了更好地理解它们,我一直在编写简单的程序.其中一个小程序我编写了两个程序,一个用于打印两个进程的计数器,另一个用两个线程打印. 我注意到的是,当线程打印一个线程的计数器然后是其他线程时,fork打印交错的计数器.所以线程不是
我对线程和分叉比较新.所以为了更好地理解它们,我一直在编写简单的程序.其中一个小程序我编写了两个程序,一个用于打印两个进程的计数器,另一个用两个线程打印.
我注意到的是,当线程打印一个线程的计数器然后是其他线程时,fork打印交错的计数器.所以线程不是那么平行,但行为更串行为什么呢?难道我做错了什么?

另外,pthread_join究竟做了什么?即使我不做pthread_join,程序运行也类似.

这是我的线程代码

void * thread1(void *a){
    int i =0;
for(i=0; i<100; i++)
    printf("Thread 1      %dn",i);
}

void * thread2(void *b){
int i =0;
for(i=0; i<100; i++)
    printf("Thread 2    %dn",i);
}

int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,thread1,NULL);
pthread_create(&tid2,thread2,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}

这是我的fork代码

int main(void)
{
pid_t childPID;
childPID = fork();

if(childPID >= 0) // fork was successful
{
    if(childPID == 0) // child process
    {   int i;
    for(i=0; i<100;i++)
        printf("n Child Process Counter : %dn",i);

    }
    else //Parent process
    {
        int i;
        for(i=0; i<100;i++)
            printf("n Parent Process Counter : %dn",i);
    }
}
else // fork failed
{
    printf("n Fork failed,quitting!!!!!!n");
    return 1;
}

return 0;
}

编辑:
如何使线程程序更像fork程序?即计数器打印交织.

解决方法

你在这条艰难的道路上旅行.您应该学习的教训是不要试图考虑操作系统调度程序.无论你做什么 – 处理时间表,优先级或你转过的任何旋钮 – 你都无法可靠地完成它.

您已经支持发现同步机制的需求 – 互斥体,信号量,条件变量,线程障碍等.您想要做的就是它们存在的原因以及您应该使用什么来实现目标.

在您的上一个问题上,pthread_join从死的,可连接的(即未分离的)线程中回收一些资源,并允许您检查过期线程中的任何返回变量.在你的程序中,它们主要用作阻塞机制.也就是说,main将阻止这些调用,直到线程到期.如果没有pthread_joins,您的main将结束并且进程将死亡,包括您创建的线程.如果你不想加入线程并且没有在main中做任何有用的事情,那么在main中使用pthread_exit,因为这将允许main退出但线程继续处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读