子线程怎么不阻塞主线程

子线程怎么不阻塞主线程,第1张

可我想主函数不被阻塞,怎么办呢? 还有什么更好的办法么 ?(linux下面和win32的解答都能说下最好了)

------解决方案--------------------------------------------------------如果主线程不需要等待你那个子函数里调用的子线程全部结束,那个子函数里的线程可以以分离状态运行,线程调用pthread_detach(pthread_self())或者C/C++ code pthread_attr_t attr; pthread_attr_init(&attr); pthread_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&tid, &attr, routine, NULL);

------解决方案--------------------------------------------------------子函数中使用了pthread_join()就自然阻塞了,你要想不阻塞,只有把pthread_join放到函数外面去了。

小菜愚见,仅供参考。

------解决方案--------------------------------------------------------detach或者轮询检测标记后join。

------解决方案--------------------------------------------------------给你借鉴下:

C/C++ code #include #include #include #include volatile LONG g_bCon; void printThread(void pArg) { int i = 0; while(g_bCon) { printf("%d\n",i++); } } void countThread(void pArg) { _beginthread(printThread,0,0); Sleep(1000); g_bCon = 0; } int main(int argc, char argv[]) { g_bCon = 1; _beginthread(countThread,0,0); system("pause"); /这里必须要暂停下/ return 0; }

------解决方案--------------------------------------------------------windows中在主线程退出前必须要用WaitForSingleObject(),不然子线程也会跟着退出

------解决方案--------------------------------------------------------用消息机制

------解决方案--------------------------------------------------------子函数又添加了pthread_join()

这个就会让子函数阻塞等待了,如果想不阻塞等待的话就不能用这个函数了,可以在子函数创建线程时,设置成分离(detach)状态, pthread_detach(thread_id),让线程自己管理自己的后事,自动释放资源等。

常用词汇:

1、short:修饰int,短整型数据,可省略被修饰的int。

2、long:修饰int,长整型数据,可省略被修饰的int。

3、long long:修饰int,超长整型数据,可省略被修饰的int。

4、signed:修饰整型数据,有符号数据类型。

5、unsigned:修饰整型数据,无符号数据类型。

6、restrict:用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。

7、return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。

8、continue:结束当前循环,开始下一轮循环。

9、break:跳出当前循环或switch结构。

10、goto:无条件跳转语句。

11、if:条件语句,后面不需要放分号。

12、else:条件语句否定分支(与if连用)。

13、switch:开关语句(多重分支语句)。

14、case:开关语句中的分支标记,与switch连用。

15、default:开关语句中的“其他”分支,可选。

常用函数:

1、int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z'),返回非0值,否则返回0。

2、int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值,否则返回0。

3、int abs(int i) 返回整型参数i的绝对值。

4、double cabs(struct complex znum) 返回复数znum的绝对值。

5、double fabs(double x) 返回双精度参数x的绝对值。

6、long labs(long n) 返回长整型参数n的绝对值。

—C语言

第一个问题,不管是创建进程或者创建线程都不会阻塞,创建完毕马上返回不会等待子进程或者子线程的运行

第二个问题

首先进程和线程是不一样的

多进程时,父进程如果先结束,那么子进程会被init进程接收成为init进程的子进程,接下来子进程接着运行,直到结束,init进程负责取得这些子进程的结束状态并释放进程资源。而如果是子进程先结束,那么父进程应当用wait或者waitpid去获取子进程的结束状态并释放进程资源,否则子进程会成为僵死进程,它占用的进程资源不会释放

多线程时,如果父线程或者说你讲的main结束时使用return或者exit或者处理完毕结束,那么整个进程都结束,其他子线程自然结束。如果main结束时使用的是pthread_exit那么只有父线程结束,子线程还在运行。同样对于子线程结束时如果调用了exit,那么整个进程包括父线程结束,如果调用了pthread_exit或者正常结束,那么只有子线程结束。

另外子线程结束时如果没有分离属性,其他线程应当使用pthread_join去获取线程结束状态并释放线程资源,如同进程里的wait和waitpid

虽然 thread 类的初始化可以提供这么丰富和方便的形式,其实现的底层依然是创建一个 pthread 线程并运行之,有些实现甚至是直接调用 pthread_create 来创建。

创建一个线程之后,我们还需要考虑一个问题:该如何处理这个线程的结束?一种方式是等待这个线程结束,在一个合适的地方调用 thread 实例的 join() 方法,调用者线程将会一直等待着目标线程的结束,当目标线程结束之后调用者线程继续运行;另一个方式是将这个线程分离,由其自己结束,通过调用 thread 实例的 detach() 方法将目标线程置于分离模式。一个线程的 join() 方法与 detach() 方法只能调用一次,不能在调用了 join() 之后又调用 detach(),也不能在调用 detach() 之后又调用 join(),在调用了 join() 或者 detach() 之后,该线程的 id 即被置为默认值(空线程),表示不能继续再对该线程作修改变化。如果没有调用 join() 或者 detach(),那么,在析构的时候,该线程实例将会调用 std::terminate(),这会导致整个进程退出,所以,如果没有特别需要,一般都建议在生成子线程后调用其 join() 方法等待其退出,这样子最起码知道这些子线程在什么时候已经确保结束。

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存