#include<stdio.h> #include<sys/types.h> #include<semaphore.h> #include<pthread.h> sem_t sem_id1, sem_id2, sem_id3; void* func1(void*); //声明 void* func2(void*); void* func3(void*); int main(void) { sem_init(&sem_id1, 0, 1); //活动 sem_init(&sem_id2, 0, 0); sem_init(&sem_id3, 0, 0); pthread_t pthread_id1, pthread_id2, pthread_id3; pthread_create(&pthread_id1, NULL, func1, NULL); pthread_create(&pthread_id2, NULL, func2, NULL); pthread_create(&pthread_id3, NULL, func3, NULL); pthread_join(phread_id1, NULL); pthread_join(phread_id1, NULL); pthread_join(phread_id1, NULL); return 0; } void *func1 (void*) { sem_wait(sem_id1); printf("A\n"); sem_post(sem_id2); } void *func2 (void*) { sem_wait(sem_id2); printf("B\n"); sem_post(sem_id3); } void *func3 (void*) { sem_wait(sem_id3); printf("C\n"); sem_post(sem_id1); }
package ABC; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Main { private static final Lock lock=new ReentrantLock(); private static final Condition isA=lock.newCondition(); private static final Condition isB=lock.newCondition(); private static final Condition isC=lock.newCondition(); static class ThreadA extends Thread { @Override public void run() { while(true){ lock.lock(); System.out.println("A"); isB.signal(); try { isA.await(); } catch (InterruptedException e) { e.printStackTrace(); } lock.unlock(); } } } static class ThreadB extends Thread { @Override public void run() { while(true){ lock.lock(); System.out.println("B"); isC.signal(); try { isB.await(); } catch (InterruptedException e) { e.printStackTrace(); } lock.unlock(); } } } static class ThreadC extends Thread { @Override public void run() { while(true){ lock.lock(); System.out.println("C"); isA.signal(); try { isC.await(); } catch (InterruptedException e) { e.printStackTrace(); } lock.unlock(); } } } public static void main(String[] args) throws InterruptedException { ThreadA a=new ThreadA(); ThreadB b=new ThreadB(); ThreadC c=new ThreadC(); a.join(); b.join(); c.join(); a.start(); b.start(); c.start(); } }
lockb=threading.Lock() lockc=threading.Lock() def printa(): print 'A' lockb.release() def printb(): lockb.acquire() print 'B' lockc.release() lockb.release() def printc(): lockc.acquire() print 'C' lockc.release() def run(): lockb.acquire() lockc.acquire() tc = threading.Thread(target=printc) tc.start() tb = threading.Thread(target=printb) tb.start() ta = threading.Thread(target=printa) ta.start() if __name__ == '__main__': run()