免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1495 | 回复: 8
打印 上一主题 下一主题

线程之间能不能管道啊! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-08 14:38 |只看该作者 |倒序浏览
线程之间能不能管道通讯啊!这样数据就是先进先出的了,谢谢请指教啊

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-09-08 19:27 |只看该作者

线程之间能不能管道啊!

应该没有问题的。

管道都是先进先出的呀。

论坛徽章:
0
3 [报告]
发表于 2003-09-09 09:02 |只看该作者

线程之间能不能管道啊!

Pipe一般用于进程之间,系统有开销,且效率不是太好。所以同一进程的不同线程,不建议使用Pipe。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-09-09 10:41 |只看该作者

线程之间能不能管道啊!

或许有些需要共享的东西可以设计为全局变量。
如果不能满足要求,可以考虑线程之间的通讯机制。

论坛徽章:
0
5 [报告]
发表于 2003-09-09 12:32 |只看该作者

线程之间能不能管道啊!

还有我的线程开了怎么没反映啊,线程里的好象都没做啊
我的主程序执行到开线程的地方在下面就没了怎么回事呢????
fd全局的
mask,sdmax,SOCKMAX都是全局的
void *Recvdata(void *)
{
        int status = 0;
        int nbytes = 0;         
        char buffer[BUF_SIZE] ="0";
        char str[BUF_SIZE] = "0";
        char pipedata[2*BUF_SIZE]= "0";
        struct fd_set rmask;
        close(fd[0]);
        for ( ; ; )
        {
                rmask = mask;
                status = select(sdmax + 1, &rmask, ZERO, ZERO, NULL);
                if (status >; 0)
                {
           for(int i = 0; i < SOCKMAX; i++)
                   {
                           if (FD_ISSET(sd, &rmask))
                           {
                                   bzero(pipedata,2*BUF_SIZE);
                                   bzero(buffer,BUF_SIZE);
                                   nbytes = read(sd, buffer, BUF_SIZE);
                                   bzero(str,BUF_SIZE);
                                   getNodeId(sd,str);
                                   if (nbytes >; 0)
                                   {
                                           strncpy(pipedata, buffer, BUF_SIZE);
                                           strncat(pipedata,str,BUF_SIZE);
                                           printf("node:%s\n",pipedata);
                                           write(fd[1], pipedata, 2*BUF_SIZE);
                                   }
                                   if(nbytes <= 0)
                                   {
                                           close(sd);
                                           if (sd >;= sdmax)
                                                   sdmax = sd[i-1];
                                           SOCKMAX--;
                                   }//end if close
                           }//end if FD_ISSET
                   }//end for
                   if (status < 0)break;
                }
        }
}
pthread_create(&threadrecv,PTHREAD_CREATE_DETACHED,Recvdata,NULL);

论坛徽章:
0
6 [报告]
发表于 2003-09-09 15:28 |只看该作者

线程之间能不能管道啊!

主线程用pthread_join()挂起,等待线程退出.

论坛徽章:
0
7 [报告]
发表于 2003-09-09 16:27 |只看该作者

线程之间能不能管道啊!

进程之间何必使用管道呢?
一个数组加互斥锁不就解决了吗?

论坛徽章:
0
8 [报告]
发表于 2003-09-09 16:54 |只看该作者

线程之间能不能管道啊!

能。但不应该这样用。
楼上说的极是。
PIPE是和文件系统类似的实现,很慢。

论坛徽章:
0
9 [报告]
发表于 2003-09-09 16:58 |只看该作者

线程之间能不能管道啊!

我也要怎么快,因为是8秒发个数据过来,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP