例を通してセマフォを数える概念を理解しようとしています。しかし、私はこれをLinuxのSysVを使って実装したいと思っています。
私はバイナリセマフォとカウントセマフォの理論的な部分に精通しています。
私はこれを参照しましたlinkSysVを使ってセマフォを数える
概念的には、セマフォーはあるプロセスから別のプロセスへのシグナル伝達メカニズムとして使用されるため、私は単純なプログラムを作成しようとしていました。以下のプログラムで
は、私はそれがthread_2
からの信号を取得していないまで待つ
thread_1
をしたいし、それが
thread_3
からの信号を取得していないまでも同様
thread_2
待つ必要があります。
出力はこのようなものになるよう: Hello From thread 3 Hello from thread 2 Hello from thread 1
私はそれが適切pthread_join()
を使用して達成することができます知っているが、私は、セマフォを使用して、それを達成したいです。
コード:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
int sem_id;
struct sembuf sops[3];
void thread_1(void)
{
sops[0].sem_num = 0;
sops[0].sem_op = 0;
sops[0].sem_flg = 0;
if(semop(sem_id, sops, 1) < 0)
perror("Semop In thread 3");
else
printf("Hello From thread 1\n");
}
void thread_2(void)
{
sops[0].sem_num = 0;
sops[0].sem_op = -1;
sops[0].sem_flg = 0;
if(semop(sem_id, sops, 1) < 0)
perror("Semop In thread 2");
else
printf("Hello from thread 2\n");
}
void thread_3(void)
{
sops[0].sem_num = 0;
sops[0].sem_op = -1;
sops[0].sem_flg = 0;
if(semop(sem_id, sops, 1) < 0)
perror("Semop In thread 3");
else
printf("Hello from thread 3\n");
}
int main(void)
{
void (*funct[]) = {thread_1, thread_2, thread_3};
key_t semkey;
char i;
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
}arg;
pthread_t thread_id[3];
semkey = ftok("/tmp", 'a');
if(semkey < 0)
perror("Cannot Create Semaphore Key");
else
{
sem_id = semget(semkey, 1, (IPC_CREAT|IPC_EXCL|0666));
if(sem_id < 0)
perror("Cannot create semaphore\n");
else
{
arg.val = 3;
if (semctl(sem_id, 0, SETVAL, arg) == -1) {
perror("semctl");
exit(1);
}
}
}
for(i = 0; i < 3; i++)
{
if(pthread_create(&thread_id[i], NULL, funct[i], NULL) < 0)
perror("Cannot Create thread\n");
}
for(i = 0; i < 3; i++)
pthread_join(thread_id[i], NULL);
if(semctl(sem_id, 0, IPC_RMID, NULL) == -1)
perror("semctl");
return 0;
}
私は私が何をしようとしています何を達成するために、複数のセマフォセットを使用する必要がありますか?
pthread_wait、btwはありません。あなたはおそらくpthread_joinを意味します。 – PSkocik
はい、ありがとうございます。訂正済! – Gaurav