有名信号量在多线程间的同步

/*semopen_pth.c*/
#include <stdio.h>
#include <semaphore.h>
#include <fcntl.h>
#include <pthread.h>
#include<stdlib.h>
void print();
void * thread_function(void *arg);
sem_t * sem;
int main(int argc,char * argv[])
{
int n=0,i=0;
pthread_t tid[5];
if(argc != 2)
{
printf("Usage:%s name.\n",argv[0]);
exit(0);
}
//init semaphore
sem=sem_open(argv[1],O_CREAT,0644,3);
while(n++<5)
{
if((pthread_create(&tid[i],NULL,thread_function,NULL))!=0)
{
printf("can‘t create pthread.\n");
exit(0);
}
i++;
}
for(i=0;i<5;i++)
pthread_join(tid[i],NULL);

sem_close(sem);
sem_unlink(argv[1]);
return 0;
}

void * thread_function(void *arg)
{
sem_wait(sem);
print();
sleep(1); //因为共享段执行过快,不能达到同步效果,所以需要睡眠
sem_post(sem);

printf("finish, pthread_id is%lu\n",pthread_self());
}

void print()
{
int value;
printf("pthread_id is %lu, get the resource\n",pthread_self());
sem_getvalue(sem,&value);
printf("now,the semaphore value is %d\n",value);
}
/*
[[email protected] Desktop]# gcc b.c -lpthread -lrt
[[email protected] Desktop]# ./a.out yy
pthread_id is 3046529904, get the resource
now,the semaphore value is 2
pthread_id is 3036040048, get the resource
now,the semaphore value is 1
pthread_id is 3057019760, get the resource
now,the semaphore value is 0
finish, pthread_id is3046529904
finish, pthread_id is3036040048
finish, pthread_id is3057019760
pthread_id is 3067509616, get the resource
now,the semaphore value is 2
pthread_id is 3077999472, get the resource
now,the semaphore value is 1
finish, pthread_id is3067509616
finish, pthread_id is3077999472
[[email protected] Desktop]#

*/

时间: 2024-10-12 04:02:41

有名信号量在多线程间的同步的相关文章

二进制信号量在多线程间实现同步模型

在多线程同步开发中,为了实现执行线程在条件未到达时等待条件到达,进而用忙等待实现等待,这样大大浪费了CPU资源且CPU占用很大,导致服务器系统整体性能下降.为了解决CPU占用大的问题,用信号量替代忙等待条件,实现执行线程在条件未到达时用阻塞等待条件到达.下面是用二进制信号量实现多线程间同步简单设计模型.#include<stdio.h>#include<unistd.h>#include<string.h>#include<semaphore.h> #def

无名信号量在多线程间的同步

//无名信号量的常见用法是将要保护的变量放在sem_wait和sem_post中间所形成的临界区内,这样该变量就会被//保护起来,例如:#include <pthread.h>#include <semaphore.h>#include <sys/types.h>#include <stdio.h>#include <unistd.h>int number; // 被保护的全局变量sem_t sem_id;void* thread_one_fun

第七十四课、多线程间的同步

一.多线程间的同步 1.多线程编程的本质 (1).并发性是多线程编程的本质 (2).在宏观上,所有线程并行执行 (3).多个线程间相互独立,互不干涉 2.特殊情况下,多线程存在依赖 煮菜和煮饭这两个线程结束后,才能进行吃饭的线程 3.同步的概念 (1).在特殊情况下,控制多线程间的相对执行顺序 (2).QThread类支持线程间的同步 #include <QCoreApplication> #include <QThread> #include <QDebug> /*

C#多线程间的同步问题

使用线程时最头痛的就是共享资源的同步问题,处理不好会得到错误的结果,C#处理共享资源有以下几种: 1.lock锁 2.Mutex类 3.semaphore 其中lock 和mutex 差不多,都是锁定同一个资源,不同之处mutex在整个进程中都可以访问到. semaphore是锁定多个资源,比如同一时期只能有两个线程访问,其它线程只能等待其中之一释放锁才能使用,Semaphore就是一个可以多次进入的“Mutex”.Mutex永远只允许一个线程拥有它,而Semaphore可以允许多个线程请求,因

vc++高级班之多线程篇[6]---线程间的同步机制①

①.线程同步的必要性: int g_Num = 0; UINT __cdecl ThreadProc(LPVOID lpParameter) { for (int idx = 0; idx < 100; ++idx) { g_Num = g_Num+1; CString strNum; strNum.Format(_T("%d"), g_Num); g_Num = g_Num-1; } return 0; } void CThreadTestDlg::OnBnClickedBtn

Linux系统编程——进程同步与互斥:POSIX有名信号量

在 POSIX 标准中,信号量分两种,一种是无名信号量,一种是有名信号量.无名信号量一般用于线程间同步或互斥,而有名信号量一般用于进程间同步或互斥.它们的区别和管道及命名管道的区别类似,无名信号量则直接保存在内存中,而有名信号量要求创建一个文件.前面我们学习了无名信号量的使用(详情请看<无名信号量>),这里我们学习有名信号量的使用. 1)创建一个有名信号量 所需头文件: #include <fcntl.h> #include <sys/stat.h> #include

进程同步与互斥:POSIX有名信号量

在 POSIX 标准中,信号量分两种,一种是无名信号量,一种是有名信号量.无名信号量一般用于线程间同步或互斥,而有名信号量一般用于进程间同步或互斥.它们的区别和管道及命名管道的区别类似,无名信号量则直接保存在内存中,而有名信号量要求创建一个文件.前面我们学习了无名信号量的使用(详情请看<无名信号量>),这里我们学习有名信号量的使用. 1)创建一个有名信号量 所需头文件: #include <fcntl.h> #include <sys/stat.h> #include

进程同步与相互排斥:POSIX有名信号量

在 POSIX 标准中,信号量分两种,一种是无名信号量,一种是有名信号量. 无名信号量一般用于线程间同步或相互排斥,而有名信号量一般用于进程间同步或相互排斥. 它们的差别和管道及命名管道的差别类似.无名信号量则直接保存在内存中,而有名信号量要求创建一个文件.前面我们学习了无名信号量的使用(详情请看<无名信号量>).这里我们学习有名信号量的使用. 1)创建一个有名信号量 所需头文件: #include <fcntl.h> #include <sys/stat.h> #in

C# 多线程之线程同步

多线程间应尽量避免同步问题,最好不要线程间共享数据.如果必须要共享数据,就需要使用同步技术,确保一次只有一个线程访问和改变共享状态. 一::lock语句 lock语句事设置锁定和接触锁定的一种简单方法.其语法非常简单: lock (obj) { // 需要发生同步的代码区 } 将共享数据的操作代码,放在上述的"{...}"区域内.锁定的对象(obj)必须是引用类型,如果锁定一个值类型,实际是锁定了它的一个副本,并没有实现锁定功能. 一般地,被锁定对象需要被创建为 私有 只读 引用类型: