zoukankan      html  css  js  c++  java
  • 线程的基本使用

    线程
    线程的绝大多数函数名都以pthread_开头,我们可以通过如下几步来线程函数库。
    1:定义宏_REENTRANT;
    2:在程序中包含头文件“pthread.h”;
    3:在编译程序时需要用选项-lpthread来连接线程库;

    步骤说明:
    1:我们通过定义宏_REENTRANT来告诉编译器我们需要可重入功能。

    2:头文件pthread.h中有我们需要的线程函数。
    #include <pthread.h>

    int pthread_create(pthread_t *thread, pthread_attr_t *attr, void*(*start_routine)(void*), void *arg);
    void pthread_exit(void* retval);
    int pthread_join(pthread_t th ,void **thread_return);
    pthread_t pthread_self();

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

    void *thread_function(void *arg);
    int run_now = 1;
    char message[] = "Hello World";

    int main() {
    int res;
    pthread_t a_thread;
    void *thread_result;
    int print_count1 = 0;

    res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
    if (res != 0) {
    perror("Thread creation failed");
    exit(EXIT_FAILURE);
    }

    pthread_t tid;
    pid_t pid;
    tid = pthread_self();
    pid = getpid();
    printf("thread_id and process_id is :[%lu]@[%lu] ",tid,pid);

    printf(" Waiting for thread to finish... ");
    res = pthread_join(a_thread, &thread_result);
    if (res != 0) {
    perror("Thread join failed");
    exit(EXIT_FAILURE);
    }
    printf("Thread joined ");
    exit(EXIT_SUCCESS);
    }

    void *thread_function(void *arg) {
    pthread_t tid;
    pid_t pid;
    tid = pthread_self();
    pid = getpid();
    printf("thread_id and process_id is :[%lu]@[%lu] ",tid,pid);

    sleep(3);
    }

    编译上面的程序的命令是:
    cc -D_REENTRANT -lpthread thread_test.c -o thread_test

    信号量
    信号量函数的名字都以sem_开头。

    #include <semaphore.h>

    int sem_init(sem_t *sem, int pshared, unsigned int value);
    int sem_wait(sem_t *sem);
    int sem_post(sem_t *sem);
    int sem_destory(sem_t *sem);

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

    void *thread_function(void *arg);
    sem_t bin_sem;

    #define WORK_SIZE 1024
    char work_area[WORK_SIZE];

    int main() {
    int res;
    pthread_t a_thread;
    void *thread_result;

    res = sem_init(&bin_sem, 0, 0);
    if (res != 0) {
    perror("Semaphore initialization failed");
    exit(EXIT_FAILURE);
    }
    res = pthread_create(&a_thread, NULL, thread_function, NULL);
    if (res != 0) {
    perror("Thread creation failed");
    exit(EXIT_FAILURE);
    }
    printf("Input some text. Enter 'end' to finish ");
    while(strncmp("end", work_area, 3) != 0) {
    fgets(work_area, WORK_SIZE, stdin);
    sem_post(&bin_sem);
    }
    printf(" Waiting for thread to finish... ");
    res = pthread_join(a_thread, &thread_result);
    if (res != 0) {
    perror("Thread join failed");
    exit(EXIT_FAILURE);
    }
    printf("Thread joined ");
    sem_destroy(&bin_sem);
    exit(EXIT_SUCCESS);
    }

    void *thread_function(void *arg) {
    sem_wait(&bin_sem);
    while(strncmp("end", work_area, 3) != 0) {
    printf("You input %d characters ", strlen(work_area) -1);
    sem_wait(&bin_sem);
    }
    pthread_exit(NULL);
    }

    互斥量

    #include <pthread.h>

    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
    int pthread_mutex_lock(pthread_mutex_t *mutex);
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    int pthread_mutex_destroy(pthread_mutex_t *mutex);

    举例:
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include <semaphore.h>

    void *thread_function(void *arg);
    pthread_mutex_t work_mutex; /* protects both work_area and time_to_exit */

    #define WORK_SIZE 1024
    char work_area[WORK_SIZE];
    int time_to_exit = 0;

    int main() {
    int res;
    pthread_t a_thread;
    void *thread_result;
    res = pthread_mutex_init(&work_mutex, NULL);
    if (res != 0) {
    perror("Mutex initialization failed");
    exit(EXIT_FAILURE);
    }
    res = pthread_create(&a_thread, NULL, thread_function, NULL);
    if (res != 0) {
    perror("Thread creation failed");
    exit(EXIT_FAILURE);
    }
    pthread_mutex_lock(&work_mutex);
    printf("Input some text. Enter 'end' to finish ");
    while(!time_to_exit) {
    fgets(work_area, WORK_SIZE, stdin);
    pthread_mutex_unlock(&work_mutex);
    while(1) {
    pthread_mutex_lock(&work_mutex);
    if (work_area[0] != '') {
    pthread_mutex_unlock(&work_mutex);
    sleep(1);
    }
    else {
    break;
    }
    }
    }
    pthread_mutex_unlock(&work_mutex);
    printf(" Waiting for thread to finish... ");
    res = pthread_join(a_thread, &thread_result);
    if (res != 0) {
    perror("Thread join failed");
    exit(EXIT_FAILURE);
    }
    printf("Thread joined ");
    pthread_mutex_destroy(&work_mutex);
    exit(EXIT_SUCCESS);
    }

    void *thread_function(void *arg) {
    sleep(1);
    pthread_mutex_lock(&work_mutex);
    while(strncmp("end", work_area, 3) != 0) {
    printf("You input %d characters ", strlen(work_area) -1);
    work_area[0] = '';
    pthread_mutex_unlock(&work_mutex);
    sleep(1);
    pthread_mutex_lock(&work_mutex);
    while (work_area[0] == '' ) {
    pthread_mutex_unlock(&work_mutex);
    sleep(1);
    pthread_mutex_lock(&work_mutex);
    }
    }
    time_to_exit = 1;
    work_area[0] = '';
    pthread_mutex_unlock(&work_mutex);
    pthread_exit(0);
    }

    线程的属性

    #include <pthread.h>
    int pthread_attr_init(pthread_attr_t *attr);
    int pthread_attr_destroy(pthread_attr_t *attr);

    分离线程
    分离线程之后,新线程已经脱离原线程,不再能用pthread_join ()进行合并。
    #include <pthread.h>

    int pthread_detach(pthread_t thread);

    取消线程
    #include <pthread.h>

    int pthread_cancel(pthread_t thread);

  • 相关阅读:
    adb稳定性monkey测试(转载)
    Cookie、sessionStorage、localStorage的异同
    Vue-eBookReader 学习笔记(初始化部分)
    ValueError: Max value is 14 解决方案
    Chrome 报错: Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
    Bootstrap使用方法
    Vue笔记
    3D相册 复仇者联盟
    奔跑的少年
    钟表练习 html+css实现
  • 原文地址:https://www.cnblogs.com/babyha/p/3641753.html
Copyright © 2011-2022 走看看