teknoraver icon

c switch

teknoraver | PRO | 12/19/19 01:28:55 PM UTC | 0 ⭐ | 946 👁️ | Never ⏰ | []
C |

960 B

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <pthread.h>
 
struct iter {
    int in, out;
};
 
static long counter;
 
static void * inc(void *arg)
{
    struct iter *iter = (struct iter *)arg;
    int buf;
 
    while (read(iter->in, &buf, sizeof(buf)) > 0) {
        buf++;
        counter = buf;
        write(iter->out, &buf, sizeof(buf));
    }
 
    close(iter->in);
    close(iter->out);
    return NULL;
}
 
int main(int argc, char *argv[])
{
    pthread_t t1, t2;
    int fds[4];
 
    pipe(fds);
    pipe(fds+2);
 
    struct iter iter1 = {
        .in = fds[0],
        .out = fds[3],
    };
    struct iter iter2 = {
        .in = fds[2],
        .out = fds[1],
    };
 
    pthread_create(&t1, NULL, inc, &iter1);
    pthread_create(&t2, NULL, inc, &iter2);
 
    write(iter1.out, &counter, sizeof(counter));
    sleep(1);
    pthread_cancel(t1);
    pthread_cancel(t2);
 
    printf("messages/sec: %lu\n", counter);
    printf("time for message: %luns\n", 1000000000 / counter);
 
    return 0;
}

Comments