zoukankan      html  css  js  c++  java
  • 线程同步

    原子操作

    互斥mutex相互排斥的意思,它是一种锁或者信号灯。

    互斥用来保护多个线程共享的数据和结构,不会被同时修改,一个互斥锁只能有两种状态:

    locked 枷锁

    unlocked 解锁

    加锁后互斥不让其他线程访问。

    任何时刻只能有一个线程来掌握某个互斥上锁。

    一个线程如果试图在一个已经加锁的互斥上再加锁,这个线程会被挂起,知道加锁的线程释放掉

    互斥锁为止。

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

    int pthread_mutex_lock(pthread_mutex_t *mutex);//加锁

    int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁

    PTHREAD_MUTEX_INITIALIZER是初始化一个加锁的宏定义。

    ////////////////////////////////////////////////////////////////////////////////////////////////////


    //最恰当的互斥用法
    /*
    ============================================================================
    Name : thread.c
    Author : zhujy
    Version :
    Copyright : Your copyright notice
    Description : Hello World in C, Ansi-style
    ============================================================================
    */

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

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁

    int count = 0;

    void *func1(void *arg)
    {

    int *a = (int *) arg;
    printf("thread%d start ", *a);
    int i;
    for (i = 0; i < 10; i++)
    {
    printf("thread%d is running ", *a);
    sleep(1);
    pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码
    count++;//这段代码受到保护,永远只有一个线程可以操作
    pthread_mutex_unlock(&mutex);//给mutex解锁
    }
    printf("thread%d end ", *a);

    pthread_exit(NULL);
    }

    int main(int arg, char * args[])
    {
    printf("process start ");
    pthread_t thr_d1, thr_d2;
    int i[2];
    i[0] = 1;
    i[1] = 2;


    pthread_create(&thr_d1, NULL, func1, &i[0]);
    pthread_create(&thr_d2, NULL, func1, &i[1]);
    pthread_join(thr_d1, NULL);
    pthread_join(thr_d2, NULL);

    printf("process end ");
    return 0;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////

    /互斥锁的例子

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//初始化了一个MUTEX锁

    void *func1(void *arg)
    {
    pthread_mutex_lock(&mutex);//给mutex加锁,这是一条原子操作,不可能出现两个线程同时执行这个代码  是一个队列结果锁几次就必须解锁几次。
    int *a = (int *) arg;
    printf("thread%d start ", *a);
    int i;
    for (i = 0; i < 10; i++)
    {
    printf("thread%d is running ", *a);
    sleep(1);
    }
    printf("thread%d end ", *a);
    pthread_mutex_unlock(&mutex);//给mutex解锁
    pthread_exit(NULL);
    }

    int main(int arg, char * args[])
    {
    printf("process start ");
    pthread_t thr_d1, thr_d2;
    int i[2];
    i[0] = 1;
    i[1] = 2;


    pthread_create(&thr_d1, NULL, func1, &i[0]);
    pthread_create(&thr_d2, NULL, func1, &i[1]);
    pthread_join(thr_d1, NULL);
    pthread_join(thr_d2, NULL);

    printf("process end ");
    return 0;
    }

  • 相关阅读:
    利用jquery获取html中被选中的input的值
    获取表单选中的值(利用php和js两种方式)
    复习
    Ajax请求中的async:false/true的作用
    Jquery
    C#创建控制台项目引用Topshelf的方式,部署windows服务。
    你循环的时候就可以给他们赋值了,那么就不用addClass,再根据类选择器处理,代码能一气呵成就别写成两段了
    SQL server 数据库中插入中文变???格式乱码的问题另一种容易忽略的情况(C#操作dapper)
    SQL 两个表有关联,通过其中一个表的列,更新另一个表的列。
    SQL server 存储过程中 列传行
  • 原文地址:https://www.cnblogs.com/yuankaituo/p/4373056.html
Copyright © 2011-2022 走看看