跳转至

Pthread

TODO:

https://randu.org/tutorials/threads/


TODO:

https://randu.org/tutorials/threads/

简单使用

pthread_t thread;
pthread_create(&thread, NULL, thr_func, NULL);

thr_func返回时,pthread仍保留着线程资源和返回值,直到使用pthread_join取走返回值并释放资源。

同步

mutex 互斥锁

简单的锁, 常用.

rwlock读写锁

仅在“并行读的次数远远大于写的次数”且“读占用时需要较多cpu时间”的场景使用.

因为rwlock的实现需要做更多的逻辑, 效率比简单的mutex差, 仅在满足上述条件的少数情况有使用的必要.

从 pthread_t 获得 PID 和 TID

一个思路是找到偏移量,然后打印出来,问题是不同实现的偏移量不同,做法不能通用

int get_tid_from_pthread(pthread_t t)
{
    struct pthread_fake {
        void *nothing[90];
        pid_t tid;
    };

    struct pthread_fake* f = (struct pthread_fake*)t;
    return f->tid;
}

int get_pid_from_pthread(pthread_t t)
{
    struct pthread_fake {
        void *nothing[90];
        pid_t tid;
        pid_t pid;
    };

    struct pthread_fake* f = (struct pthread_fake*)t;
    return f->pid;
}

还是在线程里使用gettid()来得快(版本过早的glibc没有gettid(),改用syscall):

#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>

printf("thread %s: %d\n", This->name.c_str(), syscall(SYS_gettid));;

pthread提升线程优先级

单独设置有限级没用,还要设置调度算法

  {
    struct sched_param sched_params;
    sched_params.sched_priority = 50;
    pthread_setschedparam(pthread_self(), SCHED_RR, &sched_params);
  }

错误

错误1

Assertion `mutex->__data.__owner == 0' failed

https://blog.csdn.net/luckyapple1028/article/details/51588946

错误2

__pthread_mutex_lock_full: Assertion `INTERNAL_SYSCALL_ERRNO (e, __err) != ESRCH || !robust' failed