线程

作者: 如果听见下雨的声音 | 来源:发表于2020-04-21 14:42 被阅读0次

简单线程

#include <pthread.h>
#include <iostream>

void *task_a(void *arg)
{
    auto no = reinterpret_cast<long int>(arg);

    for (;;)
    {
        printf("Thread %ld precess pid: %u \t thread id = %lu\n", no, getpid(), pthread_self());

        sleep(1);

    }
}

void create_thread()
{
    printf("Main precess pid: %u \t thread id = %lu\n", getpid(), pthread_self());

    pthread_t tid;

    for (int i = 0; i < 5; i++)
    {
        pthread_create(&tid, nullptr, task_a, reinterpret_cast<void *>(i));
    }

    sleep(1);

    printf("Main thread exit \n");

//    pthread_exit(nullptr);

//    exit(0);
    return;
}

带参线程

#include <pthread.h>
#include <iostream>

struct run_arg_t
{
    int num;
    char data[50];
};

typedef struct run_arg_t run_arg_t;


void thread_exit()
{

    printf("Main precess pid: %u \t thread id = %lu\n", getpid(), pthread_self());

    auto run = [](void *arg) -> void *
    {

        printf("this tid:%lu \n", pthread_self());

        auto *runArg = (run_arg_t *) arg;

        runArg->num = 123456789;

        strcpy(runArg->data, "123456789");

        usleep(2000);

        pthread_testcancel();

        pthread_exit(runArg);

        return arg;
    };

    pthread_t tid;

    pthread_attr_t attr;

    pthread_attr_init(&attr);

    size_t get_size;

    pthread_attr_getstacksize(&attr, &get_size);

    printf("thread default stack size:%ld\n", get_size);

    size_t stack_size = 100000000;

    void *stack = malloc(stack_size);

    pthread_attr_setstack(&attr, stack, stack_size);

//    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    run_arg_t runArg = {123, "sdfsfsfsj"};

    runArg.num = 1;

    strcpy(runArg.data, "231423535634");

    printf("num=%d, data = %s\n", runArg.num, runArg.data);

    pthread_create(&tid, &attr, run, &runArg);

    printf("Main tid:%lu \n", pthread_self());

    printf("Child tid:%lu \n", tid);

    pthread_cancel(tid);

    pthread_attr_destroy(&attr);

    run_arg_t *retArg;

    int ret = pthread_join(tid, (void **) &retArg);

    if (ret == 0)
    {
        printf("ret arg num=%d, data = %s\n", retArg->num, retArg->data);
    } else
    {

        printf("detach recycle thread\n");

    }

    usleep(1000);

    free(stack);
}

最大线程数

#include <pthread.h>
#include <iostream>

void create_max_thread()
{
    struct run_arg_t
    {
        int num;
        char data[50];
    };

    typedef struct run_arg_t run_arg_t;


    printf("Main precess pid: %u \t thread id = %lu\n", getpid(), pthread_self());

    auto run = [](void *arg) -> void *
    {
        printf("thread %ld tid:%lu \n", reinterpret_cast<long int>(arg), pthread_self());

//        usleep(10);

        for (;;);

        pthread_exit(arg);
    };

    pthread_t tid;

    void *stack = nullptr;

    int ret;

    for (int i = 0; i < 1000000; i++)
    {
        pthread_attr_t attr;

        pthread_attr_init(&attr);

        size_t get_size;

        pthread_attr_getstacksize(&attr, &get_size);

        printf("thread default stack size:%ld\n", get_size);

        size_t stack_size = 100000000;

        stack = malloc(stack_size);

        pthread_attr_setstack(&attr, stack, stack_size);

        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

        ret = pthread_create(&tid, &attr, run, reinterpret_cast<void *>(i));

        if (ret == 0)
        {
            printf("create %lu thread %d \n", tid, i);
        } else
        {
            static int count = 0;

            count++;

            perror(strerror(ret));

            if (count < 5)
                continue;
            else
                break;
        }

        pthread_attr_destroy(&attr);
    }

    free(stack);
}

mutex

c++版本

#include <pthread.h>
#include <iostream>

void thread_sync_mutex_whit_cxx()
{
    struct Runnable
    {
        virtual void *run(void *) noexcept = 0;

    };

    struct Run : Runnable
    {
        pthread_mutex_t mutex;

        int count;

        inline Run() noexcept : count(0), mutex(pthread_mutex_t{})
        {
            pthread_mutex_init(&mutex, nullptr);
        }

        inline virtual ~Run() noexcept
        {
            pthread_mutex_destroy(&mutex);
        }

        inline void *run(void *arg) noexcept final
        {

            for (;;)
            {
                pthread_mutex_lock(&mutex);

                auto index = reinterpret_cast<long>(arg);

                if (index)
                    printf("count:%d \n", count);
                else
                    count++;

//                sleep(1);

                pthread_mutex_unlock(&mutex);
            }

            pthread_exit(arg);

            /*int ret;

             for (;;)
                 if (ret = pthread_mutex_lock(&mutex) == 0)
                 {
                     auto index = reinterpret_cast<long>(arg);

                     if (index)
                         printf("count:%d \n", count);
                     else
                         count++;

                     pthread_mutex_unlock(&mutex);

                 } else
                 {
                     printf("Cant't lock, error:%s\n", strerror(ret));
                 }*/
        }

        inline void *operator()(void *arg) noexcept
        {
            return run(arg);
        }


        static void *running(void *arg) noexcept
        {
            static Run run{};

            return run(arg);
        }
    };

    pthread_t tids[2];

    pthread_create(tids, nullptr, Run::running, (void *) 0);

    pthread_create(tids + 1, nullptr, Run::running, (void *) 1);

    usleep(1000);

    pthread_join(tids[0], nullptr);
    pthread_join(tids[1], nullptr);

}

纯c++版本

#include <thread>
#include <mutex>
#include <iostream>

void thread_sync_mutex_whit_pure_cxx()
{

    class Running
    {
        virtual void run(int i) noexcept = 0;
    };

    class Runner : Running
    {
    private:
        std::mutex mutex1{};
        int count;

    public:
        Runner() : count(0) {}

        inline void operator()(int i) noexcept
        {
            run(i);
        }

        inline void run(int i) noexcept override
        {

            for (;;)
            {
                mutex1.lock();

                if (i % 2)
                {
                    count++;
                } else
                {
                    std::cout << "thread id: " << std::this_thread::get_id() << "\t count = " << count << std::endl;
                }

                mutex1.unlock();
            }
        }

    };

    std::vector<std::thread> threads;

    Runner runner{};

    for (int i = 0; i < 5; i++)
    {
        threads.push_back(std::thread(std::ref(runner), i));
    }

    for (auto &th: threads)
        th.join();
}

纯c版本

#include <pthread.h>
#include <iostream>

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

static int count = 0;

void *running1(void *arg)
{
    for (;;)
    {
        pthread_mutex_lock(&mutex);

        count++;

        pthread_mutex_unlock(&mutex);
    }

    pthread_exit(arg);
}

void *running2(void *arg)
{
    for (;;)
    {
        pthread_mutex_lock(&mutex);

        printf("count:%d \n", count);

        pthread_mutex_unlock(&mutex);
    }

    pthread_exit(arg);
}

void thread_sync_mutex_with_c()
{

    pthread_t tids[2];

    pthread_create(tids, nullptr, running1, (void *) 0);

    pthread_create(tids + 1, nullptr, running2, (void *) 1);

    usleep(1000);

    pthread_join(tids[0], nullptr);
    pthread_join(tids[1], nullptr);

    pthread_mutex_destroy(&mutex);
}

条件变量(condition)

#include <pthread.h>
#include <iostream>

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;


void *running_cond1(void *arg)
{
    for (;;)
    {
        pthread_mutex_lock(&mutex);

        pthread_cond_signal(&cond);

        pthread_cond_wait(&cond, &mutex);

        count++;

        pthread_cond_signal(&cond);

        pthread_mutex_unlock(&mutex);
    }

    pthread_exit(arg);
}


void *running_cond2(void *arg)
{

    for (;;)
    {
        pthread_mutex_lock(&mutex);

        pthread_cond_signal(&cond);

        pthread_cond_wait(&cond, &mutex);

        printf("count:%d \n", count);

        pthread_cond_signal(&cond);

        pthread_mutex_unlock(&mutex);
    }

    pthread_exit(arg);
}

void thread_cond_mutex_with_c()
{
    pthread_t tids[2];

    pthread_create(tids, nullptr, running_cond1, (void *) 0);

    pthread_create(tids + 1, nullptr, running_cond2, (void *) 1);

    usleep(1000);

    pthread_join(tids[0], nullptr);
    pthread_join(tids[1], nullptr);

    pthread_mutex_destroy(&mutex);

    pthread_cond_destroy(&cond);

}

信号量(semaphore)

#include <semaphore.h>
#include <pthread.h>
#include <iostream>

sem_t sem;

void *running_sem(void *arg)
{
    for (;;)
    {
        sem_wait(&sem);

        long int index = (long int) arg;
        printf("thread %lu ...\n", index);

        sem_post(&sem);

        sleep(1);
    }

    pthread_exit(nullptr);
}


void thread_sem_with_c()
{
    sem_init(&sem, 0, 1);

    pthread_t tids[7];

    for (int i = 0; i < 7; i++)
        pthread_create(tids + i, nullptr, running_sem, reinterpret_cast<void *>(i));

    usleep(1000);

    for (int i = 0; i < 7; i++)
        pthread_join(tids[i], nullptr);

    sem_destroy(&sem);
}

屏障(barrier)

#include <pthread.h>
#include <iostream>

pthread_barrier_t barrier;

void *running_barrier1(void *arg)
{

    sleep(1);

    long int index = (long int) arg;

    printf("thread %lu waiting.... \n", index);

    pthread_barrier_wait(&barrier);

    printf("thread %lu running.... \n", index);

    for (int i = 0;; i++)
    {

        sleep(i % 3);

        printf("thread %lu %d'th count waiting.... \n", index, i);

        pthread_barrier_wait(&barrier);

        printf("thread %lu %d'th count  starting.... \n", index, i);

        sleep(1);

        count++;

        pthread_barrier_wait(&barrier);

    }

    pthread_exit(arg);
}


void *running_barrier2(void *arg)
{

    sleep(3);

    long int index = (long int) arg;

    printf("thread %lu waiting.... \n", index);

    pthread_barrier_wait(&barrier);

    printf("thread %lu running.... \n", index);

    for (int i = 0;; i++)
    {

        sleep(i % 5);

        printf("thread %lu %d'th print  waiting.... \n", index, i);

        pthread_barrier_wait(&barrier);

        printf("thread %lu  %d'th print  starting.... \n", index, i);

        sleep(1);

        printf("thread %lu print count:%d \n", index, count);

        pthread_barrier_wait(&barrier);
    }

    pthread_exit(arg);
}


void thread_barrier_with_c()
{
    pthread_barrier_init(&barrier, nullptr, 2);

    pthread_t tids[2];

    pthread_create(tids, nullptr, running_barrier1, (void *) 0);

    pthread_create(tids + 1, nullptr, running_barrier2, (void *) 1);

    usleep(1000);

    pthread_join(tids[0], nullptr);

    pthread_join(tids[1], nullptr);

    pthread_barrier_destroy(&barrier);
}

读写锁(rwlock)


once


相关文章

  • Android

    线程间通信 主线程和工作线程主线程和工作线程 工作线程与工作线程工作线程与工作线程 为什么主线程Looper.lo...

  • 三、操作系统之线程

    前言 什么是线程 引入线程的原因 线程的概念 线程和进程的关系 线程结构 线程有点 多线程模型 用户线程和内核线程...

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • 总结多线程与设计模式+synchronized+性能+高吞吐+死

    Java线程 Java语言的线程 何谓线程 线程启动 线程的暂时停止 线程的共享互斥 线程的协调 线程的状态转移 ...

  • 多线程编程

    摘要 线程概念,线程与进程的区别与联系学会线程控制,线程创建,线程终止,线程等待了解线程分离与线程安全学会线程同步...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java并发之守护线程

    java中有两种线程,用户线程和守护线程用户线程:主线程停止时,用户线程不会停止守护线程:主线程停止时,守护线程也...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • 线程基础知识

    线程学习 线程的基础知识 线程是什么? 线程和进程的关系 线程的6个状态 线程优先级 主线程、多线程、后台线程的概...

  • 多线程介绍

    一、进程与线程 进程介绍 线程介绍 线程的串行 二、多线程 多线程介绍 多线程原理 多线程的优缺点 多线程优点: ...

网友评论

      本文标题:线程

      本文链接:https://www.haomeiwen.com/subject/jgvuihtx.html