重新运行已取消的pthread

保罗·波诺马列夫

我的问题是我无法重用已取消的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_condwaitpthread_condtimedwaitpthread_condbroadcast触发线程中使用条件变量(和互斥锁)

接下来,stopAlgorithm线程的目的是什么?它所做的就是algorithm在0到6秒之间的不可预测的时间后取消线程吗?为什么不只是pthread_cancel从主线程发送

接下来,您是否关心取消算法的位置?如果没有,就pthread_cancel这样。如果是这样的话(无论如何,我认为它要好得多),请定期检查一个标志(如上所示的原子和易失性,或由互斥锁保护)以及pthread_exit是否已设置该标志如果您的算法每秒执行一次大块操作,请检查一下。如果它做很多细微的事情,则每执行1000次操作(例如)进行一次检查,因此使用互斥锁不会造成性能损失。

最后,如果您取消了一个线程(或一个线程pthread_exit),则再次启动它的方法就是简单地pthread_create再次调用然后,这是一个运行相同代码的新线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法重新运行已取消的任务

来自分类Dev

重新启动ScheduledThreadPoolExecutor中的已取消任务

来自分类Dev

Dask-如何取消和重新提交已暂停的任务?

来自分类Dev

已取消任务时任务仍在运行

来自分类Dev

触摸其他通知时,已重新发送已取消的通知。安卓

来自分类Dev

触摸其他通知时,已重新发送已取消的通知。安卓

来自分类Dev

如何在Windows XP上重新启动已取消的更新

来自分类Dev

取消Play商店中已发布的android应用程序的重新发行版本

来自分类Dev

Laravel迁移已取消

来自分类Dev

为什么已取消任务并再次运行新任务?

来自分类Dev

长时间运行的Azure索引器抛出“操作已取消”异常

来自分类Dev

Videogular播放可在台式机上运行,在Android上因请求已取消而失败

来自分类Dev

自重新启动以来系统已唤醒/运行/运行了多长时间

来自分类Dev

Emberjs重新取消

来自分类Dev

如何知道pthread已停止?

来自分类Dev

从Windows 10运行时,ClickOnce不会取消注册/重新注册VSTO解决方案

来自分类Dev

pthread运行多次

来自分类Dev

耳机插孔已静音,但是如果我重新插入耳机,则需要进入alsamixer并再次取消静音

来自分类Dev

耳机插孔已静音,但是如果我重新插入耳机,则需要进入alsamixer并再次取消静音

来自分类Dev

pthread_cancel和取消点

来自分类Dev

如果目标已超过X小时,请告诉make重新运行目标?

来自分类Dev

检查进程是否已关闭/未运行,然后重新启动应用程序

来自分类Dev

如果目标已超过X小时,请告诉make重新运行目标?

来自分类Dev

任务已取消异常(ThrowForNonSuccess)

来自分类Dev

SMTP发送邮件已取消

来自分类Dev

如何创建已取消的任务

来自分类Dev

Tensorflow入队操作已取消

来自分类Dev

检查CancellationToken是否已取消

来自分类Dev

取消已挂起的ProcessPoolExecutor未来

Related 相关文章

  1. 1

    无法重新运行已取消的任务

  2. 2

    重新启动ScheduledThreadPoolExecutor中的已取消任务

  3. 3

    Dask-如何取消和重新提交已暂停的任务?

  4. 4

    已取消任务时任务仍在运行

  5. 5

    触摸其他通知时,已重新发送已取消的通知。安卓

  6. 6

    触摸其他通知时,已重新发送已取消的通知。安卓

  7. 7

    如何在Windows XP上重新启动已取消的更新

  8. 8

    取消Play商店中已发布的android应用程序的重新发行版本

  9. 9

    Laravel迁移已取消

  10. 10

    为什么已取消任务并再次运行新任务?

  11. 11

    长时间运行的Azure索引器抛出“操作已取消”异常

  12. 12

    Videogular播放可在台式机上运行,在Android上因请求已取消而失败

  13. 13

    自重新启动以来系统已唤醒/运行/运行了多长时间

  14. 14

    Emberjs重新取消

  15. 15

    如何知道pthread已停止?

  16. 16

    从Windows 10运行时,ClickOnce不会取消注册/重新注册VSTO解决方案

  17. 17

    pthread运行多次

  18. 18

    耳机插孔已静音,但是如果我重新插入耳机,则需要进入alsamixer并再次取消静音

  19. 19

    耳机插孔已静音,但是如果我重新插入耳机,则需要进入alsamixer并再次取消静音

  20. 20

    pthread_cancel和取消点

  21. 21

    如果目标已超过X小时,请告诉make重新运行目标?

  22. 22

    检查进程是否已关闭/未运行,然后重新启动应用程序

  23. 23

    如果目标已超过X小时,请告诉make重新运行目标?

  24. 24

    任务已取消异常(ThrowForNonSuccess)

  25. 25

    SMTP发送邮件已取消

  26. 26

    如何创建已取消的任务

  27. 27

    Tensorflow入队操作已取消

  28. 28

    检查CancellationToken是否已取消

  29. 29

    取消已挂起的ProcessPoolExecutor未来

热门标签

归档