当前位置: 技术问答>linux和unix
子线程和主线程的通信问题
来源: 互联网 发布时间:2015-01-10
本文导语: 本人欲使用多线程开发一网络程序。实现两台机器的对等全双工通信。现在,我用一子线程实现接收,一个线程实现发送。 int pthread_create(pthread_t *thread,pthread_attr_t *attr, void *(*start_routine)(void *),void *arg); void pthr...
本人欲使用多线程开发一网络程序。实现两台机器的对等全双工通信。现在,我用一子线程实现接收,一个线程实现发送。
int pthread_create(pthread_t *thread,pthread_attr_t *attr,
void *(*start_routine)(void *),void *arg);
void pthread_exit(void *retval);
int pthread_join(pthread *thread,void **thread_return);
通过在主线程中查看thread_return来得到网络接收的内容,但必须结束线程。由于所发送的内容是连续不断的,希望不结束线程就能得到内容。希望高手帮忙。谢谢!
int pthread_create(pthread_t *thread,pthread_attr_t *attr,
void *(*start_routine)(void *),void *arg);
void pthread_exit(void *retval);
int pthread_join(pthread *thread,void **thread_return);
通过在主线程中查看thread_return来得到网络接收的内容,但必须结束线程。由于所发送的内容是连续不断的,希望不结束线程就能得到内容。希望高手帮忙。谢谢!
|
线程分为两种。listener thread/worker thread
服务器端:
listener thread
1.负责在端口lfd侦听(listen)lfd。
2.创建(accept)新端口nfd。并读取1字节(假设1字节。0: Ready?!/1: Real Data)如果是0,则写nfd一个字节0回应客户端。如果是1的话检测worker thread数量是否到最大线程数,没有的话则创建一个worker thread.(当然预先创建一些worker thread更好)。
3.如果第二步是1的话,同时listener thread将新创建的端口放到一个可读端口队列上。
worker thread
1.阻塞在可读队列上取端口,当有可读端口时取出
2.当第一步取出端口后read 当读完图象信息时,关闭端口close nfd.
调用模块做你想要做的事(调用模块,实现这些模块,我准备开进程。一个进程实现一个模块。这些模块的参数可以通过管道实现。)
客户端大致一样的。
listener thread
负责发送1字节,并侦听。如果是0的话,。将新端口号通过管道写给worker thread .
worker thread
阻塞在管道上。当收到端口号时读图象。写端口。
负责关闭。
再次阻塞在管道上。
===============================
粗略的写了一下。大致能满足要求了。当然如果考虑多并发的话,还要改进一些的。譬如,客户端建立一些常连接,多产生几个worker thread同时做。服务器也可以这样的。
哈哈,继续讨论哦,这个问题还是比较有意思的。
服务器端:
listener thread
1.负责在端口lfd侦听(listen)lfd。
2.创建(accept)新端口nfd。并读取1字节(假设1字节。0: Ready?!/1: Real Data)如果是0,则写nfd一个字节0回应客户端。如果是1的话检测worker thread数量是否到最大线程数,没有的话则创建一个worker thread.(当然预先创建一些worker thread更好)。
3.如果第二步是1的话,同时listener thread将新创建的端口放到一个可读端口队列上。
worker thread
1.阻塞在可读队列上取端口,当有可读端口时取出
2.当第一步取出端口后read 当读完图象信息时,关闭端口close nfd.
调用模块做你想要做的事(调用模块,实现这些模块,我准备开进程。一个进程实现一个模块。这些模块的参数可以通过管道实现。)
客户端大致一样的。
listener thread
负责发送1字节,并侦听。如果是0的话,。将新端口号通过管道写给worker thread .
worker thread
阻塞在管道上。当收到端口号时读图象。写端口。
负责关闭。
再次阻塞在管道上。
===============================
粗略的写了一下。大致能满足要求了。当然如果考虑多并发的话,还要改进一些的。譬如,客户端建立一些常连接,多产生几个worker thread同时做。服务器也可以这样的。
哈哈,继续讨论哦,这个问题还是比较有意思的。
|
线程间通讯不用IPC,直接将共享存储区的指针传给新线程即可
比如:
int main()
{
char buff[1024]={0};
pthread_t tid;
pthread_create(&tid, NULL, your_start_routine, (void *)buff);
sleep(2);//sleep a while
printf("%sn",buff);
return 0;
}
void * your_start_routine(void *arg)
{
while(1)
{
fd = socket(...);
connect(fd, ...);
read(fd, arg, size);
sleep(2);//wait for main thread to printf
}
pthread_exit(...);
}
只起示例作用,具体还有可能要加锁,看一看帮助吧
man pthread_create
man pthread_mutex_lock
...
或pthread.h
比如:
int main()
{
char buff[1024]={0};
pthread_t tid;
pthread_create(&tid, NULL, your_start_routine, (void *)buff);
sleep(2);//sleep a while
printf("%sn",buff);
return 0;
}
void * your_start_routine(void *arg)
{
while(1)
{
fd = socket(...);
connect(fd, ...);
read(fd, arg, size);
sleep(2);//wait for main thread to printf
}
pthread_exit(...);
}
只起示例作用,具体还有可能要加锁,看一看帮助吧
man pthread_create
man pthread_mutex_lock
...
或pthread.h