线程(一)概念、创建、标识、终止、连接、分离、属性

概念

  • 使用多线程在做串行任务时,需要阻塞。

线程比进程有优势的地方

  • 同一个进程的多个线程可以并发执行

进程 VS 线程


进程堆栈

线程共享的资源属性

线程数据类型

线程标识

  • 进程ID是唯一的,但线程ID只有在所属的进程上下文才有意义。

对两个线程ID进行比较。

获取自身线程ID


判断两个线程ID是否相同

线程池工作任务


线程创建



#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>   // exit()

pthread_t ntid;

void printids(const char *s)
{
    pid_t pid;
    pthread_t tid;

    pid = getpid();
    tid = pthread_self();
    printf("%s pid:%lu, tid:%lu.\n", s, (unsigned long)pid, (unsigned long)tid);
}

void * thr_fn(void *arg)
{
    printids("new  thread:");
    return ((void *)0);
}
int main(void)
{
    int err;

    err = pthread_create(&ntid, NULL, thr_fn, NULL);
    if (err != 0)   // 1表示失败
    {
        //err_exit(err, "error");
        exit(1);
    }
    printids("main thread:");
    sleep(1);
    return 0;
}

线程终止的方法

pthread_exit


pthread_join





#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>


void *fn(void *arg)
{
    char *str = (char *)arg;        // 用来强制转换类型,接受参数
    printf("%s", str);
    return (void *)strlen(str);     // 可以强制转为void * 来返回参数
}

int main(void){
    pthread_t tid;
    int err;
    void *res;      // 用来接受线程的返回值

    err = pthread_create(&tid, NULL, fn, "Hello world!\n");
    if (err != 0){              // 1:失败
        perror("Error pthread create.\n");
        exit(1);
    }
    printf("Message from main().\n");
    err = pthread_join(tid, &res);  
    if (err != 0)       // join也是可以判断失败与否,1:失败
    {
        perror("Error pthread join.\n");
        exit(1);
    }
    printf("Thread return value:%ld.\n", (long)res);    // long好一点,默认数字有点大

    return 0;
}

线程分离



线程分离

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

void * fn(void * arg)
{
    int *i = (int *) arg;
    printf("value : %d.\n", *i);
}


int main(void){
    pthread_t tid;
    pthread_attr_t attr;
    int s;

    // 先初始化attr
    s = pthread_attr_init(&attr);       
    if (s != 0)
    {
        perror("pthread_attr_init");
        exit(1);
    }

    // 设置attr属性
    s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if (s != 0)
    {
        perror("pthread_attr_setdetachstate.\n");
        exit(1);
    }

    // 用attr属性创建新线程
    s = pthread_create(&tid, &attr, fn, (void *)1);
    if (s != 0)
    {
        perror("pthread_attr_create");
        exit(1);
    }

    return 0;
}

属性

posted @ 2022-04-01 08:54  starc的miao  阅读(74)  评论(0)    收藏  举报