20220920线程属性

20220920线程属性

互斥锁

使用mutex(互斥量)一般步骤
1.pthread_mutex_t mutex;创建锁
2.pthread_mutex_init:初始化
3.pthread_mutex_lock:加锁
4访问共享数据(stdout)
5.pthread_mutex_unlock:解锁
6.pthread_mutex_destroy:销毁锁

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
//pthread_mutex_t &#x4E92;&#x65A5;&#x9501;&#x7C7B;&#x578B;&#x540D;&#xFF0C;
pthread_mutex_t mutex;//&#x5B9A;&#x4E49;&#x53E6;&#x4E00;&#x4E2A;&#x4E92;&#x65A5;&#x9501;&#x53D8;&#x91CF;mutex&#xFF0C;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#xFF0C;&#x6240;&#x6709;&#x7EBF;&#x7A0B;&#x53EF;&#x4EE5;&#x5171;&#x4EAB;&#x4F7F;&#x7528;

void *tfn2(void *arg)
{//&#x5F53;&#x67D0;&#x4E2A;&#x7EBF;&#x7A0B;&#xFF0C;&#x4E0D;&#x8FDB;&#x884C;&#x5BF9;&#x5171;&#x4EAB;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x52A0;&#x9501;&#x64CD;&#x4F5C;&#x65F6;&#xFF0C;&#x4ECD;&#x65E7;&#x4F1A;&#x9020;&#x6210;&#x62A2;&#x593A;&#x8D44;&#x6E90;&#x73B0;&#x8C61;
    srand(time(NULL));
    while(1)
    {
        int ret=pthread_mutex_trylock(&mutex);
        if(ret!=0)
        {
            printf("pthread_mutx_trylock err:%s\n",strerror(ret));
        }
        else
        {
            printf("---tfn2()---print ");
            sleep(rand() % 3);
            printf("to stdout\n");
            sleep(rand() % 3);
            ret=pthread_mutex_unlock(&mutex);//&#x89E3;&#x9501;
            if(ret!=0)
            {
                fprintf(stderr,"pthread_mutex_unlock() error:%s\n",strerror(ret));
            }
        }
            printf("common tfn2()------\n");
            sleep(rand() % 3);
    }
}

void *tfn(void *arg)
{
    srand(time(NULL));
    while (1)
    {
        int ret=pthread_mutex_lock(&mutex);//&#x52A0;&#x9501;
        if(ret!=0)
        {
            fprintf(stderr,"pthread_mutex_lock() error:%s\n",strerror(ret));
        }
        printf("hello ");
        sleep(rand() % 3);
        printf("world\n");
        //pthread_mutex_unlock(),&#x5BF9;&#x52A0;&#x9501;&#x6210;&#x529F;&#x7684;&#x5171;&#x4EAB;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x89E3;&#x9501;
        ret=pthread_mutex_unlock(&mutex);//&#x89E3;&#x9501;
        if(ret!=0)
        {
            fprintf(stderr,"pthread_mutex_unlock() error:%s\n",strerror(ret));
        }
        sleep(rand() % 3);

    }
    return NULL;
}

int main(void)
{
    pthread_t tid;
    srand(time(NULL));
    //pthread_mutex_init&#xFF08;&#xFF09;&#x521D;&#x59CB;&#x5316; &#x4E92;&#x65A5;&#x9501;
    int ret=pthread_mutex_init(&mutex,NULL);//&#x521D;&#x59CB;&#x5316;&#x9501;
    if(ret!=0)
    {
        fprintf(stderr,"mutex init error:%s\n",strerror(ret));
    }
    //pthread_create() &#x521B;&#x5EFA;&#x7EBF;&#x7A0B;1
    ret=pthread_create(&tid, NULL, tfn, NULL);
    if(ret!=0)
    {
        fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
    }
    //pthread_create() &#x521B;&#x5EFA;&#x7EBF;&#x7A0B;2
    ret=pthread_create(&tid, NULL, tfn2, NULL);
    if(ret!=0)
    {
        fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
    }
    while (1)
    {   //pthread_mutex_lock()&#x7ED9;&#x5DF2;&#x521D;&#x59CB;&#x5316;&#x8FC7;&#x7684;&#x4E92;&#x65A5;&#x9501;&#x53D8;&#x91CF;&#xFF0C;(&#x7AD9;&#x5728;&#x5F53;&#x524D;&#x7EBF;&#x7A0B;&#x89D2;&#x5EA6;)&#x5BF9;&#x5171;&#x4EAB;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x52A0;&#x9501;&#x64CD;&#x4F5C;
        //&#x5982;&#x679C;&#x52A0;&#x9501;&#x5931;&#x8D25;&#xFF0C;&#x5219;&#x963B;&#x585E;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4E00;&#x76F4;&#x7B49;&#x5F85;
        ret=pthread_mutex_lock(&mutex);//&#x52A0;&#x9501;
        if(ret!=0)
        {
            fprintf(stderr,"pthread_mutex_lock() error:%s\n",strerror(ret));
        }
        printf("HELLO ");
        sleep(rand() % 3);
        printf("WORLD\n");
        //pthread_mutex_unlock(),&#x5BF9;&#x52A0;&#x9501;&#x6210;&#x529F;&#x7684;&#x5171;&#x4EAB;&#x8D44;&#x6E90;&#x8FDB;&#x884C;&#x89E3;&#x9501;
        ret=pthread_mutex_unlock(&mutex);//&#x89E3;&#x9501;
        if(ret!=0)
        {
            fprintf(stderr,"pthread_mutex_unlock() error:%s\n",strerror(ret));
        }
        sleep(rand() % 3);
    }
    pthread_join(tid, NULL);
    ret=pthread_mutex_destroy(&mutex);//&#x9500;&#x6BC1;&#x9501;
    if(ret!=0)
    {
        fprintf(stderr,"pthread_mutex_destroy() error:%s\n",strerror(ret));
    }

    return 0;
}
</unistd.h></stdlib.h></pthread.h></string.h></stdio.h>

读写锁

特别强调,读写锁只有一把,但具备两种状态:
1读模式下加锁状态(读锁)
2.写模式下加锁状态(写锁)

特征:
1.读写锁是”写模式加锁”成功时,其它线程加锁都会被阻塞
2.读写锁”读模式加锁”成功时,其他线程以写模式加锁会阻塞
3.读锁、写锁并行阻塞,写锁优先级高。读锁也叫共享

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int counter=0;
//&#x7528;pthread_rwlock_t&#x7C7B;&#x578B;&#xFF0C;&#x5B9A;&#x4E49;&#x8BFB;&#x5199;&#x9501;&#x53D8;&#x91CF;rwlock
pthread_rwlock_t rwlock;
/* 3&#x4E2A;&#x7EBF;&#x7A0B;&#x4E0D;&#x5B9A;&#x65F6;&#x5199;&#x540C;&#x4E00;&#x5168;&#x5C40;&#x8D44;&#x6E90;&#xFF0C;5&#x4E2A;&#x7EBF;&#x7A0B;&#x4E0D;&#x5B9A;&#x65F6;&#x8BFB;&#x540C;&#x4E00;&#x5168;&#x5C40;&#x8D44;&#x6E90;*/
void *th_write(void *arg)
{
    int t;
    int i = (long int)arg;
    while (1)
    {
        pthread_rwlock_wrlock(&rwlock);//&#x4EE5;&#x5199;&#x6A21;&#x5F0F;&#x52A0;&#x9501;
        t = counter;
        counter++;
//      sleep(1);
        printf("=====write i=%d:tid=%lu:counter=%d ++counter=%d\n", i, pthread_self(), t, counter);
        pthread_rwlock_unlock(&rwlock);
        sleep(1);
    }
    return NULL;
}

void *th_read(void *arg)
{
    int i = (long int)arg;
    while (1)
    {
        pthread_rwlock_rdlock(&rwlock);//&#x8BFB;&#x7EBF;&#x7A0B;&#x95F4;&#xFF0C;&#x8BFB;&#x9501;&#x5171;&#x4EAB;
        printf("----------------------read i=%d:tid=%lu:counter=%d\n", i, pthread_self(), counter);
        pthread_rwlock_unlock(&rwlock);
        usleep(100000);
    }
    return NULL;
}

int main(void)
{
    long int i;
    pthread_t tid[8];
    pthread_rwlock_init(&rwlock, NULL);

    for(i=0;i<3;i++) { pthread_create(&tid[i], null, th_write, (void *)i); } for(i="0;i<5;i++)" pthread_create(&tid[i+3], th_read, pthread_join(tid[i], null); pthread_rwlock_destroy(&rwlock); return 0; < code></3;i++)></pthread.h></unistd.h></stdio.h>

Original: https://blog.csdn.net/liuasdfgqwer/article/details/126960291
Author: dddddddddddd刘
Title: 20220920线程属性

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542712/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球