页面加载中,请稍候
来源:一口Linux发布时间:2023-03-07237浏览
询问 AI
Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。
在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。为了同一时刻只允许一个任务访问资源,需要用互斥锁对资源进行保护。互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。
对互斥锁进行加锁后,任何其他试图再次对互斥锁加锁的线程将会被阻塞,直到锁被释放
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<string.h>
char*pTestBuf=nullptr;//全局变量
/*定义互斥锁*/
pthread_mutex_tmutex;
void*ThrTestMutex(void*p)
{
pthread_mutex_lock(mutex);//加锁
{
pTestBuf=(char*)p;
sleep(1);
}
pthread_mutex_unlock(mutex);//解锁
}
intmain()
{
/*初始化互斥量,默认属性*/
pthread_mutex_init(mutex,NULL);
/*创建两个线程对共享资源访问*/
pthread_ttid1,tid2;
pthread_create(tid1,NULL,ThrTestMutex,(void*)"Thread1");
pthread_create(tid2,NULL,ThrTestMutex,(void*)"Thread2");
/*等待线程结束*/
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
/*销毁互斥锁*/
pthread_mutex_destroy(mutex);
return0;
}
#include<pthread.h>
intphtread_rwlock_init(pthread_rwlock_t*restrictrwlock,constpthread_rwlockattr_t*restrictattr);
intpthread_rwlock_destroy(pthread_rwlock_t*rwlock);
#include<pthread.h>
/**加读锁*/
intpthread_rwlock_rdlock(pthread_rwlock_t*rwlock);
/**加写锁*/
intpthread_rwlock_wrlock(pthread_rwlock_t*rwlock);
/**释放锁*/
intpthread_rwlock_unlock(pthread_rwlock_t*rwlock);
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<string.h>
/*定义读写锁*/
pthread_rwlock_trwlock;
/*定义共享资源变量*/
intg_nNum=0;
/*读操作其他线程允许读操作不允许写操作*/
void*fun1(void*arg)
{
while(1)
{
pthread_rwlock_rdlock(rwlock);
{
printf("readthread1==%d\n",g_nNum);
}
pthread_rwlock_unlock(rwlock);
sleep(1);
}
}
/*读操作,其他线程允许读操作,不允许写操作*/
void*fun2(void*arg)
{
while(1)
{
pthread_rwlock_rdlock(rwlock);
{
printf("readthread2==%d\n",g_nNum);
}
pthread_rwlock_unlock(rwlock);
sleep(1);
}
}
/*写操作,其它线程都不允许读或写操作*/
void*fun3(void*arg)
{
while(1)
{
pthread_rwlock_wrlock(rwlock);
{
g_nNum++;
printf("writethread1\n");
}
pthread_rwlock_unlock(rwlock);
sleep(1);
}
}
/*写操作,其它线程都不允许读或写操作*/
void*fun4(void*arg)
{
while(1)
{
pthread_rwlock_wrlock(rwlock);
{
g_nNum++;
printf("writethread2\n");
}
pthread_rwlock_unlock(rwlock);
sleep(1);
}
}
intmain(intarc,char*argv[])
{
pthread_tThrId1,ThrId2,ThrId3,ThrId4;
pthread_rwlock_init(rwlock,NULL);//初始化一个读写锁
/*创建测试线程*/
pthread_create(ThrId1,NULL,fun1,NULL);
pthread_create(ThrId2,NULL,fun2,NULL);
pthread_create(ThrId3,NULL,fun3,NULL);
pthread_create(ThrId4,NULL,fun4,NULL);
/*等待线程结束,回收其资源*/
pthread_join(ThrId1,NULL);
pthread_join(ThrId2,NULL);
pthread_join(ThrId3,NULL);
pthread_join(ThrId4,NULL);
pthread_rwlock_destroy(rwlock);//销毁读写锁
return0;
}

include<linux/spinlock.h>
spinlock_tlock;//定义自旋锁
spin_lock_init(lock);//初始化自旋锁
spin_lock(lock);//获得锁,如果没获得成功则一直等待
{
.......//处理临界资源
}
spin_unlock(lock);//释放自旋锁
条件变量用来阻塞一个线程,直到条件发生。通常条件变量和互斥锁同时使用。条件变量使线程可以睡眠等待某种条件满足。条件变量是利用线程间共享的全局变量进行同步的一种机制。
条件变量的逻辑:一个线程挂起去等待条件变量的条件成立,而另一个线程使条件成立。
线程在改变条件状态之前先锁住互斥量。如果条件为假,线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程。如果两进程共享可读写的内存,条件变量可以被用来实现这两进程间的线程同步
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
pthread_cond_ttaxicond=PTHREAD_COND_INITIALIZER;
pthread_mutex_ttaximutex=PTHREAD_MUTEX_INITIALIZER;
void*ThrFun1(void*name)
{
char*p=(char*)name;
//加锁,把信号量加入队列,释放信号量
pthread_mutex_lock(taximutex);
{
pthread_cond_wait(taxicond,taximutex);
}
pthread_mutex_unlock(taximutex);
printf("ThrFun1:%snowgotasignal!\n",p);
pthread_exit(NULL);
}
void*ThrFun2(void*name)
{
char*p=(char*)name;
printf("ThrFun2:%scondsignal.\n",p);//发信号
pthread_cond_signal(taxicond);
pthread_exit(NULL);
}
intmain(intargc,char**argv)
{
pthread_tThread1,Thread2;
pthread_attr_tthreadattr;
pthread_attr_init(threadattr);//线程属性初始化
//创建三个线程
pthread_create(Thread1,threadattr,ThrFun1,(void*)"Thread1");
sleep(1);
pthread_create(Thread2,threadattr,ThrFun2,(void*)"Thread2");
sleep(1);
pthread_join(Thread1,NULL);
pthread_join(Thread2,NULL);
return0;
}

pthread_mutex_lock(taximutex);
{
while(value!=wantValue)
{
pthread_cond_wait(taxicond,taximutex);
}
}
pthread_mutex_unlock(taximutex);
#include<semaphore.h>
//初始化信号量
intsem_init(sem_t*sem,intpshared,unsignedintvalue);
//信号量P操作(减1)
intsem_wait(sem_t*sem);
//以非阻塞的方式来对信号量进行减1操作
intsem_trywait(sem_t*sem);
//信号量V操作(加1)
intsem_post(sem_t*sem);
//获取信号量的值
intsem_getvalue(sem_t*sem,int*sval);
//销毁信号量
intsem_destroy(sem_t*sem);
//信号量用于同步实例
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
sem_tsem_g,sem_p;//定义两个信号量
chars8Test='a';
void*pthread_g(void*arg)//此线程改变字符的值
{
while(1)
{
sem_wait(sem_g);
s8Test++;
sleep(2);
sem_post(sem_p);
}
}
void*pthread_p(void*arg)//此线程打印字符的值
{
while(1)
{
sem_wait(sem_p);
printf("%c",s8Test);
fflush(stdout);
sem_post(sem_g);
}
}
intmain(intargc,char*argv[])
{
pthread_ttid1,tid2;
sem_init(sem_g,0,0);//初始化信号量为0
sem_init(sem_p,0,1);//初始化信号量为1
pthread_create(tid1,NULL,pthread_g,NULL);
pthread_create(tid2,NULL,pthread_p,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return0;
}

一口Linux
关注,回复【1024】海量Linux资料赠送
新闻来源:一口Linux,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
一周前

2026-06-30

2026-07-06