linux 后台线程优雅退出,pthread线程安全优雅的退出

本文介绍了在Linux环境下,程序员如何选择适合写代码的机械键盘轴体,重点关注红轴和茶轴的区别。同时,详细讲解了线程安全退出的两种方法:通过信号处理库捕获Ctrl+C信号以及使用pthread_join函数。在示例代码中,展示了如何设置线程在接收到SIGINT信号后自动退出,并通过pthread_join等待线程结束。此外,还列举了常见的Linux错误返回值。
摘要由CSDN通过智能技术生成

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

linux下pthread最近在用,总结下线程安全退出的方法

最重要的2个内容,

1.捕获ctrl+c

C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:

void (*signal (int sig, void (*func)(int)))(int);

可以使用函数 raise() 生成信号,该函数带有一个整数信号编号作为参数,语法如下:

int raise (signal sig);

信号包括:

SIGABRT程序的异常终止,如调用 abort。

SIGFPE错误的算术运算,比如除以零或导致溢出的操作。

SIGILL检测非法指令。

SIGINT接收到交互注意信号。

SIGSEGV非法访问内存。

SIGTERM发送到程序的终止请求。

2.pthread_join

线程通过标记be_continue自动退出,pthread_join等待线程退出

最终代码

#include

#include

#include

#include "unistd.h"

#include

bool be_continue = true;

void *BusyWork(void *t)

{

printf("Thread starting...n");

while (be_continue)

{

//do something

sleep(1);

}

return NULL;

}

static void my_handler(int sig)

{

be_continue = false;

}

int main (int argc, char *argv[])

{

pthread_t threadid;

pthread_attr_t attr;

int rc;

void *status;

signal(SIGINT, my_handler);

/* Initialize and set thread detached attribute */

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

rc = pthread_create(&threadid, &attr, BusyWork, NULL);

if (rc) {

printf("ERROR; return code from pthread_create() is %dn", rc);

return 1;

}

while (be_continue)

{

//do something

sleep(1);

}

/* Free attribute and wait for the other threads */

pthread_attr_destroy(&attr);

rc = pthread_join(threadid, &status);

if (rc) {

printf("ERROR; return code from pthread_join() is %dn", rc);

return 1;

}

printf("Main: completed join with thread having a status of %ldn", (long)status);

printf("Main: program completed. Exiting.n");

return 0;

}

另,顺便记录下linux的通用返回值,代码中的rc值:

EPERM Operation not permitted 1

ENOENT No such file or directory 2

ESRCH No such process 3

EINTR Interrupted function 4

EIO I/O error 5

ENXIO No such device or address 6

E2BIG Argument list too long 7

ENOEXEC Exec format error 8

EBADF Bad file number 9

ECHILD No spawned processes 10

EAGAIN No more processes or not enough memory or maximum nesting level reached 11

ENOMEM Not enough memory 12

EACCES Permission denied 13

EFAULT Bad address 14

EBUSY Device or resource busy 16

EEXIST File exists 17

EXDEV Cross-device link 18

ENODEV No such device 19

ENOTDIR Not a directory 20

EISDIR Is a directory 21

EINVAL Invalid argument 22

ENFILE Too many files open in system 23

EMFILE Too many open files 24

ENOTTY Inappropriate I/O control operation 25

EFBIG File too large 27

ENOSPC No space left on device 28

ESPIPE Invalid seek 29

EROFS Read-only file system 30

EMLINK Too many links 31

EPIPE Broken pipe 32

EDOM Math argument 33

ERANGE Result too large 34

EDEADLK Resource deadlock would occur 36

EDEADLOCK Same as EDEADLK for compatibility with older Microsoft C versions 36

ENAMETOOLONG Filename too long 38

ENOLCK No locks available 39

ENOSYS Function not supported 40

ENOTEMPTY Directory not empty 41

EILSEQ Illegal byte sequence 42

STRUNCATE String was truncated 80

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值