Semaphores in Linux page 3

328阅读 0评论2008-12-12 futuregod
分类:LINUX

The IPC_RMID flag here signifies the type of operation that needs to be carried out on the semaphore identified by semid.



The following working example uses these concepts:

File: sysvsem_demo.c
#include
#include
#include
#include

//create user defined semun for initializing the semaphores

void *Thread1(void *arg)
{
int semid;
semid = (int)arg;

//in order to perform the operations on semaphore
// first need to define the sembuf object
struct sembuf op1,op2;

//operation for 0th semaphore
op1.sem_num = 0; //signifies 0th semaphore
op1.sem_op = -1; //reduce the semaphore count to lock
op1.sem_flg = 0; //wait till we get lock on semaphore

//operation for 1th semaphore
op2.sem_num = 1; //signifies 0th semaphore
op2.sem_op = -1; //reduce the semaphore count to lock
op2.sem_flg = 0; //wait till we get lock on semaphore

//locking the 0th semaphore
if (semop(semid,&op1,1) == -1)
{
perror("Thread1:semop failure Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread1:Successfully locked 0th semaphore\n");
//lock the 1th semaphore
if (semop(semid,&op2,1) == -1)
{
perror("Thread1:semop failure Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread1:Successfully locked 1th semaphore\n");



//release the 0th semaphore
op1.sem_num = 0; //signifies 0th semaphore
op1.sem_op = 1; //reduce the semaphore count to lock
op1.sem_flg = 0; //wait till we get lock on semaphore

if (semop(semid,&op1,1) == -1)
{
perror("Thread1:semop failure Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread1:Successfully unlocked 0th semaphore\n");

//release the 1th semaphore
op2.sem_num = 1; //signifies 0th semaphore
op2.sem_op = 1; //reduce the semaphore count to lock
op2.sem_flg = 0; //wait till we get lock on semaphore

if (semop(semid,&op2,1) == -1)
{
perror("Thread1:semop failure Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread1:Successfully unlocked 1th semaphore\n");
}

void *Thread2(void *arg)
{
int semid;
semid = (int)arg;

//in order to perform the operations on semaphore
// first need to define the sembuf object
struct sembuf op1,op2;

//operation for 0th semaphore
op1.sem_num = 0; //signifies 0th semaphore
op1.sem_op = -1; //reduce the semaphore count to lock
op1.sem_flg = 0; //wait till we get lock on semaphore

//operation for 1th semaphore
op2.sem_num = 1; //signifies 0th semaphore
op2.sem_op = -1; //reduce the semaphore count to lock
op2.sem_flg = 0; //wait till we get lock on semaphore

//lock the 0th semaphore
if (semop(semid,&op1,1) == -1)
{
perror("Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread2:Successfully locked 0th semaphore\n");

//lock the 1th semaphore
if (semop(semid,&op2,1) == -1)
{
perror("Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread2:Successfully locked 1th semaphore\n");

//release 0th semaphore

op1.sem_num = 0; //signifies 0th semaphore
op1.sem_op = 1; //reduce the semaphore count to lock
op1.sem_flg = 0; //wait till we get lock on semaphore

if (semop(semid,&op1,1) == -1)
{
perror("Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread2:Successfully unlocked 0th semaphore\n");

//release the 1th semaphore
op2.sem_num = 1; //signifies 0th semaphore
op2.sem_op = 1; //reduce the semaphore count to lock
op2.sem_flg = 0; //wait till we get lock on semaphore

if (semop(semid,&op2,1) == -1)
{
perror("Reason:");
exit(-1);
}
else
fprintf(stderr,"Thread2:Successfully unlocked 1th semaphore\n");

}

int main()
{
pthread_t tid1,tid2;
int semid;

//create user defined semun for initializing the semaphores

typedef union semun
{
int val;
struct semid_ds *buf;
ushort * array;
}semun_t;

semun_t arg;
semun_t arg1;

//creating semaphore object with two semaphore in a set
//viz 0th & 1th semaphore
semid = semget(IPC_PRIVATE,2,0666|IPC_CREAT);
if(semid<0)
{
perror("semget failed Reason:");
exit(-1);
}

//initialize 0th semaphore in the set to value 1
arg.val = 1;
if ( semctl(semid,0,SETVAL,arg)<0 )
{
perror("semctl failure Reason:");
exit(-1);
}
//initialize 1th semaphore in the set to value 1
arg1.val = 1;
if( semctl(semid,1,SETVAL,arg1)<0 )
{
perror("semctl failure Reason: ");
exit(-1);
}

//create two threads to work on these semaphores
if(pthread_create(&tid1, NULL,Thread1, semid))
{
printf("\n ERROR creating thread 1");
exit(1);
}
if(pthread_create(&tid2, NULL,Thread2, semid) )
{
printf("\n ERROR creating thread 2");
exit(1);
}
//waiting on these threads to complete
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);

//once done clear the semaphore set
if (semctl(semid, 1, IPC_RMID ) == -1 )
{
perror("semctl failure while clearing Reason:");
exit(-1);
}
//exit the main threads
pthread_exit(NULL);
return 0;
}
上一篇:Semaphores in Linux page 2
下一篇:Semaphores in Linux page 4