0

恐怕我不确定我在这里做错了什么。我有一个线程应用程序,它在启动时启动 3 个线程

[root@Embest /]# ps 
1111 root        608 S   fw634c_d_cdm_sb
1112 root        608 S   fw634c_d_cdm_sb
1113 root        608 S   fw634c_d_cdm_sb

然后在待机模式下等待来自串行的命令。在它运行并返回待机模式后,我用 ps 检查发生了什么;有应用程序的僵尸实例(文件名也是 sq.bracketed)

1114 root            Z   [fw634c_d_cdm_sb]
...
...
...
1768 root            Z   [fw634c_d_cdm_sb]

其中大约 628 个。

事情是,我遵循的政策是:

- 对于可分离线程 - 不在乎(它们将在完成后自行退出并释放资源)

- 对于可连接线程 - 我在运行 pthread_create 后运行 pthread_join 并等待线程函数完成。像这样:

        if (pthread_create(&tmp_thrd_id,&attr_joinable,run_function,(void *)&aStruct)!=0){
            DEBUG(printf("thread NOT created \n"));
        }else{
            DEBUG(printf("thread created !\n"));

            if (pthread_join(tmp_thrd_id,NULL)!=0){ 
                DEBUG(printf("\nERROR in joining \n"));
            }else{
                            DEBUG(printf("Thread completed\n"));
            }
        }

我只在 main 中运行 pthread_exit(NULL) ,它并没有做太多事情,并且在启动之后只是因为它不能被杀死而存在。

我可能在这里忘记了一些重要的事情。但在阅读了一些关于线程的基本指南后无法澄清什么......

谢谢您的帮助

4

1 回答 1

0

“僵尸”线程是已经退出的线程,并且正在等待某人调用 pthread_join 以收集其退出状态。因此,在您的程序中的某个地方,您正在创建线程并且最终不会为这些线程调用 pthread_join 或 pthread_detach。

于 2012-02-13T17:36:15.703 回答