pthread_join

[TLPI] C30 Thread: Introduction

混江龙づ霸主 提交于 2019-11-28 22:30:24
目录 Threads: Introduction Overview Background Details of the Pthreads API Thread Creation Thread Termination Thread IDs Joining with a Terminated Thread Detaching a Thread Thread Attributes Threads versus Processes Exercises Threads: Introduction Overview 同一个进程内的所有线程相互独立运行,执行着相同的程序,所有的线程共享相同的内存,包括初始化过的数据、未初始化的数据以及堆区(一个传统的UNIX进程是一特殊多线程进程,该进程只包括一个线程)。 在Figure 29-1中有一些简化。在实际中,每个线程的栈区可能会混入共享库以及共享内存区,这取决于线程创建的顺序、共享库被加载的顺序、共享内存区被使用的顺序。此外,每个线程的栈区分布也和Linux发行版有关。 同一个进程内的线程可以并发执行。在一个多处理器系统上,多个线程可以并行执行。如果某个线程因为IO而阻塞,其他的线程依然能够执行。 相对于进程,线程提供了很多优势。试着想想传统的UNIX编程里,通过创建多个进程来实现并发。其中一个例子,是网络服务器的设计,当接收到来自客户端的连接请求后

Linux c线程

非 Y 不嫁゛ 提交于 2019-11-28 07:21:00
1、pthread_create 2、pthread_join 3、sem_init sem_destroy 4、sem_post sem_wait 5、所有线程可以共同访问全局区 --------------------------------------------------------------------------------- 【1】程序:静态存储在磁盘上 进程:程序动态执行时 线程:可以将进程划分成多个子任务执行 【2】线程是依附于进程存在的 多个线程共同享有进程的内存空间 其中全局区可以被所有的线程访问 【3】线程的创建 int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能:在当前进程(主线程)内开启一个新的线程(副线程)。 参数:thread:存储线程ID attr:NULL,默认的线程属性:8M的栈空间 start:传一个函数名,线程的执行体 arg:NULL 返回:成功返回0,失败非0 注意:编译时加 -pthread 【4】int pthread_join(pthread_t thread, void **retval); 功能:阻塞等待一个线程的退出,当该线程结束则唤醒等待 参数:thread

分离式线程

主宰稳场 提交于 2019-11-27 00:43:06
1、技术都是为了解决实际问题的,考虑下面的场景: 主线程创建一个子线程,子线程做一些任务,在主线程上,等待子线程完成任务,然后向下运行。代码如下: #include <stdio.h> #include <pthread.h> #include <unistd.h> void* FuncA(void* arg) { printf("FuncA Time[%d]\n", time(NULL)); sleep(2); } int main(int argc,char* argv[]) { pthread_t threadA; pthread_create(&threadA, NULL, FuncA, NULL); pthread_join(threadA,NULL); printf("main Time[%d]\n", time(NULL)); getchar(); return 0; } [niu_zibin@localhost thread]$ g++ -o main main.cpp -lpthread [niu_zibin@localhost thread]$ ./main FuncA Time[1477297071] main Time[1477297073] 2、可以看到,主线程阻塞在pthread_join,那么问题来了,如何让主线程不阻塞在pthread_join呢?