套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但如今一般能够移植到其他类Unix系统上:Linux和System V的变种都支持套接字。
也许你会有疑问,那多线程间要通信,应该怎么做?前面已经说了,多数的多线程都是在同一个进程下的,它们共享该进程的全局变量,我们能够通过全局变量来实现线程间通信。假设是不同的进程下的2个线程间通信,直接參考进程间通信。
4.关于线程的堆栈
说一下线程自己的堆栈问题。
是的,生成子线程后,它会获取一部分该进程的堆栈空间,作为其名义上的独立的私有空间。(为何是名义上的呢?)由于,这些线程属于同一个进程,其它线程仅仅要获取了你私有堆栈上某些数据的指针,其它线程便能够***訪问你的名义上的私有空间上的数据变量。(注:而多进程是不能够的,由于不同的进程,同样的虚拟地址,基本不可能映射到同样的物理地址)
5.在子线程里fork
看过好几次有人问,在子线程函数里调用system或者 fork为何出错,或者fork产生的子进程是全然复制父进程的吗?
我測试过,仅仅要你的线程函数满足前面的要求,都是正常的。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<pthread.h> void* task1(void *arg1) { printf("task1/n"); system("ls"); pthread_exit( (void *)1); } int main() { int ret=0; void *p; int p1=0; pthread_t pid1; pthread_create(&pid1, NULL, task1, NULL); ret=pthread_join(pid1, &p); printf("end main/n"); return 1; }
上面这段代码就能够正常得调用ls指令。
只是,在同一时候调用多进程(子进程里也调用线程函数)和多线程的情况下,函数体内非常有可能死锁。
详细的样例能够看看这篇文章。
End:临时写到这吧,总结这东西,看来真不适合我写。有空了,想到什么了,再回来修修补补吧。