c – 螺纹和叉子

c – 螺纹和叉子,第1张

概述我对线程和分叉比较新.所以为了更好地理解它们,我一直在编写简单的程序.其中一个小程序我编写了两个程序,一个用于打印两个进程的计数器,另一个用两个线程打印. 我注意到的是,当线程打印一个线程的计数器然后是其他线程时,fork打印交错的计数器.所以线程不是那么平行,但行为更串行为什么呢?难道我做错了什么? 另外,pthread_join究竟做了什么?即使我不做pthread_join,程序运行也类似. 我对线程和分叉比较新.所以为了更好地理解它们,我一直在编写简单的程序.其中一个小程序我编写了两个程序,一个用于打印两个进程的计数器,另一个用两个线程打印.
我注意到的是,当线程打印一个线程的计数器然后是其他线程时,fork打印交错的计数器.所以线程不是那么平行,但行为更串行为什么呢?难道我做错了什么?

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

这是我的线程代码

voID * thread1(voID *a){    int i =0;for(i=0; i<100; i++)    printf("Thread 1      %d\n",i);}voID * thread2(voID *b){int i =0;for(i=0; i<100; i++)    printf("Thread 2    %d\n",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 : %d\n",i);    }    else //Parent process    {        int i;        for(i=0; i<100;i++)            printf("\n Parent Process Counter : %d\n",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退出但线程继续处理.

总结

以上是内存溢出为你收集整理的c – 螺纹叉子全部内容,希望文章能够帮你解决c – 螺纹和叉子所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存