我的问题是我无法重用已取消的pthread。样例代码:
#include <pthread.h>
pthread_t alg;
pthread_t stop_alg;
int thread_available;
void *stopAlgorithm() {
while (1) {
sleep(6);
if (thread_available == 1) {
pthread_cancel(alg);
printf("Now it's dead!\n");
thread_available = 0;
}
}
}
void *algorithm() {
while (1) {
printf("I'm here\n");
}
}
int main() {
thread_available = 0;
pthread_create(&stop_alg, NULL, stopAlgorithm, 0);
while (1) {
sleep(1);
if (thread_available == 0) {
sleep(2);
printf("Starting algorithm\n");
pthread_create(&alg, NULL, algorithm, 0);
thread_available = 1;
}
}
}
此示例应创建两个线程-一个线程将在程序开始时创建,并尝试在启动时立即取消第二个线程,在取消线程后立即重新运行第二个线程并说“我在这里”。但是,一旦算法线程取消,一旦它不再再次启动,它就会说“正在启动算法”,什么也不做,不再有“我在这里”消息。您能告诉我再次启动取消(立即停止)线程的方法吗?
UPD:因此,感谢您的帮助,我了解了问题所在。当我重新运行算法线程时,它将引发错误11:“系统缺少创建另一个线程的必要资源,否则将超出系统对进程中线程总数的限制PTHREAD_THREADS_MAX
。” 实际上我有5个线程,但只有一个被取消,其他线程被pthread_exit停止。所以在算法停止并且程序进入待机模式后,我用pthread_join
-所有线程显示0(已取消显示)检查了所有线程的状态。PTHREAD_CANCELED
),据我所知,这意味着所有线程均已成功停止。但是再尝试运行算法会再次引发错误11。因此,我检查了内存使用情况。在算法之前的待机模式下-10428,在算法运行期间,当所有线程都使用时-2026m,在算法停止后的待机模式下-2019m。因此,即使线程停止运行,它们仍会使用内存,pthread_detach
对此无济于事。线程结束后还有其他方法可以清理吗?
另外,有时在pthread_cancel上,我的程序崩溃了,“必须安装libgcc_s.so.1才能使pthread_cancel正常工作”
几点:
首先,这是不安全的:
int thread_available;
void *stopAlgorithm() {
while (1) {
sleep(6);
if (thread_available == 1) {
pthread_cancel(alg);
printf("Now it's dead!\n");
thread_available = 0;
}
}
}
至少出于某种原因,这是不安全的。首先,您尚未将其标记thread_available
为易失性。这意味着编译器可以优化stopAlgorithm
一次读取该变量,而永远不会重新读取它。其次,您不能确保对它的访问是原子的,也不能通过互斥锁对其进行保护。要么声明它:
volatile sig_atomic_t thread_available;
(或类似),或者更好的是,通过互斥体对其进行保护。
但是对于从另一个线程中触发一个线程的一般情况,最好在侦听线程中pthread_condwait
或pthread_condtimedwait
在pthread_condbroadcast
触发线程中使用条件变量(和互斥锁)。
接下来,stopAlgorithm
线程的目的是什么?它所做的就是algorithm
在0到6秒之间的不可预测的时间后取消线程吗?为什么不只是pthread_cancel
从主线程发送?
接下来,您是否关心取消算法的位置?如果没有,就pthread_cancel
这样。如果是这样的话(无论如何,我认为它要好得多),请定期检查一个标志(如上所示的原子和易失性,或由互斥锁保护)以及pthread_exit
是否已设置该标志。如果您的算法每秒执行一次大块操作,请检查一下。如果它做很多细微的事情,则每执行1000次操作(例如)进行一次检查,因此使用互斥锁不会造成性能损失。
最后,如果您取消了一个线程(或一个线程pthread_exit
),则再次启动它的方法就是简单地pthread_create
再次调用。然后,这是一个运行相同代码的新线程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句