1 线程的概念:
在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。

2 创建一个线程:

    pthread_t p2p_thread;
    pthread_attr_t p2p_thread_attr;

    pthread_attr_init(&p2p_thread_attr);        //初始化进程属性
    pthread_attr_setdetachstate(&p2p_thread_attr, PTHREAD_CREATE_DETACHED);
    if (pthread_create(&p2p_thread, &p2p_thread_attr, my_thread_recv, NULL) < 0)
    {
        perror("pthread_create");
    }

其中。我们创建了一个线程。而且该线程的处理方法为: my_thread_recv。该方法的原型为:
void *my_thread_recv(void *pdata)

3 线程相关操作函数:

pthread_create():创建一个线程
pthread_exit():终止当前线程
pthread_cancel():中断另外一个线程的运行
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init():初始化线程的属性
pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate():获取脱离状态的属性
pthread_attr_destroy():删除线程的属性
pthread_kill():向线程发送一个信号

4 互斥锁:mutex_lock
多线程编程遇到的第一个问题就是多个线程同时操作某一个相同数据时会出问题。因而我们需要引进互斥锁的概念

在 thread 线程库中。最简单的线程锁为:
pthread_mutex_t
使用方法:
4.1 定义并初始化一个互斥锁:

static pthread_mutex_t ack_head_list_lock = PTHREAD_MUTEX_INITIALIZER;

4.2 使用
临界区操作时。先获得并锁定该互斥锁。
退出临界区时,释放该锁

阻塞版本

    //获得并锁定该互斥锁。如果该锁不可获得。则进入休眠状态
    pthread_mutex_lock(&ack_head_list_lock);
    //这里进行临界操作
    ...

    //释放该锁
    pthread_mutex_unlock(&ack_head_list_lock);

需要注意的。上锁跟释放锁的操作必须是成对出现。否则下次无法获得该锁。
一旦该锁被某个线程锁定,则任何企图调用 pthread_mutex_lock 获得该锁的其它线程都将进入阻塞。

非阻塞版本:
pthread_mutex_trylock 是非阻塞的。它将会尝试去获得该锁。
如果该锁已经被其它线程锁定,则立即返回 非0 值,不会进入阻塞
如果该锁存于可获得状态,则获得该锁并锁定。返回 0

    int ret;
    //尝试获得该锁
    ret = pthread_mutex_trylock(&ack_head_list_lock);
    //返回 0 表示该锁可获得且已锁定
    if(ret == 0)
    {
        //这里进行临界操作
        ...

        //释放该锁
        pthread_mutex_unlock(&ack_head_list_lock);
    }else{
        printf("无法获得该互斥锁!\r\n");
    }