有了这个基本 pthread
下面的代码,是用什么方法来转换 pthread_create
到 fork()
并达到类似的结果。
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
void* wait_t(void* a)
{
(int)a--;
if ((int)a < 0)
{
sem_wait(&mutex);
printf("waiting\n");
}
}
void* signal_t(void* a)
{
(int)a++;
if ((int)a <= 0)
{
printf("signal\n");
sem_post(&mutex);
}
}
int main()
{
sem_init(&mutex, 0, 1);
int i = -2;
pthread_t t1, t2;
pthread_create(&t1, NULL, wait_t, i);
pthread_create(&t2, NULL, signal_t, i);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
exit(0);
}
除非我遗漏了什么,否则下面的代码可以让你使用进程而不是线程实现同样的功能。
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
sem_t mutex;
void wait_t(int a)
{
a--;
if (a < 0)
{
sem_wait(&mutex);
printf("waiting\n");
}
}
void signal_t(int a)
{
a++;
if (a <= 0)
{
printf("signal\n");
sem_post(&mutex);
}
}
int main()
{
sem_init(&mutex, 0, 1);
int i = -2;
if(fork() == 0){ // create 1st child process
wait_t(i);
exit(0);
}
if(fork() == 0){ // create 2nd child process
signal_t(i);
exit(0);
}
wait(NULL);
wait(NULL);
exit(0);
}
注意: 我没有验证任何可能由 fork()
如其所宜。