昆哥吧 关注:15贴子:242
  • 1回复贴,共1

dai ma

收藏回复

  • 61.157.97.*
 // ·þÎñÆ÷

#include <sys/sem.h>
#include <sys/ipc.h>

#define SEGSIZE 1024
#define READTIME 1
union semun {
 int val;
 struct semid_ds *buf;
 unsigned short *array;
} arg;
//Éú³ÉÐźÅÁ¿
int sem_creat(key_t key)
{
 union semun sem;
 int semid;
 sem.val = 0;
 semid = semget(key,1,IPC_CREAT|0666);
 if (-1 == semid){
  printf("create semaphore error\n");
  exit(-1);
 }
 semctl(semid,0,SETVAL,sem);
 return semid;
}
//ɾ³ýÐźÅÁ¿
void del_sem(int semid)
{
 union semun sem;
 sem.val = 0;
 semctl(semid,0,IPC_RMID,sem);
}

//p
int p(int semid)
{
 struct sembuf sops={0,+1,IPC_NOWAIT};
 return (semop(semid,&sops,1));
}
//v
int v(int semid)
{
 struct sembuf sops={0,-1,IPC_NOWAIT};
 return (semop(semid,&sops,1));
}
int main()
{
 key_t key;
 int shmid,semid;
 char *shm;
 char msg[7] = "-data-";
 char i;
 struct semid_ds buf;
 
 key = ftok("/",0);
 shmid = shmget(key,SEGSIZE,IPC_CREAT|0604);
 if (-1 == shmid){
  printf(" create shared memory error\n");
  return -1;
 }
 shm = (char *)shmat(shmid,0,0);
 if (-1 == (int)shm){
  printf(" attach shared memory error\n");
  return -1;
 }
 semid = sem_creat(key);
 for (i = 0;i <= 3;i++){
  sleep(1);
  p(semid);
  sleep(READTIME);
  msg[5] = '0' + i;
  memcpy(shm,msg,sizeof(msg));
  sleep(58);
  v(semid);
 }
 shmdt(shm);
 shmctl(shmid,IPC_RMID,&buf);
 del_sem(semid);
 return 0;

}



1楼2007-11-05 08:30回复
    • 125.67.147.*
    Q1:线程创建时,参数void *(*start_routine) (void*)的含义。要求弄清楚函数指针的定义
    Q2:线程清理处理程序的执行过程,讲解pushpop.c要求能说明pthread_cancel_pop(int execute);中execute为0和非0的作用
    Q3:讲解unlock.c和lock.c时要求回答程序的输出,并与实际输出相比较,然后分析原因

    为0,失效,为1,起作用。相当于堆栈,反序出栈

     Unlock.输出次序乱,因为没有加互斥锁。哪个线程获得CPU,哪个就运行
     Lock.c按次序先输出主线程,然后输出次线程


    4楼2007-11-12 06:50
    回复