在c中选择随机线程

时间:2016-03-02 09:33:33

标签: c multithreading pthreads

我需要随机选择三个线程中的两个,我想出了一些想法,但我不确定它们是否会起作用。

拥有3个线程的数组然后让另一个线程从那里选择,或者有三个独立的线程更好吗?在这两种情况下,您如何编写随机选择它们的函数?根据我的理解,rand()不能被使用,因为它只用于整数,除此之外我不知道该使用什么。

这是一种游戏项目,两个选定线程的获胜者将与其余线程一起玩。那么两个实例可以使用相同的功能,还是必须有一个新功能呢?我猜最有用的东西是使用相同功能的同一个线程,只是缩小了它的选择范围?

我知道这可能很简单,但我只是刚刚开始使用线程,所以请原谅我糟糕的技能。非常感谢任何帮助!

编辑:谢谢大家!但是,既然我已经困惑了,我现在真的不想进入信号量。我根据其中一条评论编写了一些代码,但它没有给我想要的输出。这就是我所拥有的:

编辑#2:我设法编写了它!唯一剩下的就是函数再次调用自己,但指针有点混淆我所以我不知道如何在else部分调用它,我不知道如何阻止随机值重复。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *play (void *myvar);
void *select (void *var);

pthread_t tid[3], th;
int i, ra1, ra2;

int main(int argc, char *argv[]) {
pthread_create(&th, NULL, &select, NULL);

for (i = 0; i < 3; i++) {
   pthread_create(&tid[i], NULL, &play, NULL);
}

pthread_join(th, NULL);

for (i = 0; i < 3; i++) {
   pthread_join(tid[i], NULL);
}

return 0;
}

void *play (void *myvar) {

printf("Thread%i hits the ball!\n", i);

return NULL;
}

void *select (void *var) {
srand ( time(NULL) );
ra1 = rand() % 3 + 1;
ra2 = rand() % 3 + 1;

if (ra1 != ra2) {
printf("Threads have been chosen! Thread%i and Thread%i will start the game!\n", 
ra1, ra2);
}
else //what to do?;

return NULL;
}

2 个答案:

答案 0 :(得分:1)

我假设您希望3个线程中的2个执行某项任务,并且此选择应该是随机的。我进一步假设您希望这三个线程“共同”进行选择,即不需要第四个线程进行选择(或者让三个线程中的一个执行特殊选择过程)。

一种可能的方法是使用计数信号量来“保护”任务,并且只允许2个线程使用它,即将信号量初始化为2。然后,您可以让每个线程休眠一个随机(小)延迟,并尝试获取信号量。

没有太多评论,请参阅此示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

struct data {
    sem_t * semaphore;
    int random;
    char const * name;
};

void task(char const * name) {
    printf("WOOOOO %s\n", name);
}

void * operation(void * d) {
    struct data * data = d;
    usleep(data->random % 1000);
    if (sem_trywait(data->semaphore) == 0) {
        task(data->name);
    } else {
        printf("FAILED, such a shame for %s\n", data->name);;
    }
    return NULL;
}

int main(void) { // NOTE: Demo, thus no error checking
    srand(time(NULL));
    sem_t * semaphore = malloc(sizeof(*semaphore));
    struct data data[3] = {
        {semaphore, rand(), "John"},
        {semaphore, rand(), "Marry"},
        {semaphore, rand(), "Rupert"}
    };
    pthread_t others[2];
    sem_init(semaphore, 0, 2);
    pthread_create(&(others[0]), NULL, &operation, &(data[0]));
    pthread_create(&(others[1]), NULL, &operation, &(data[1]));
    (void)operation(&(data[2]));
    pthread_join(others[0], NULL);
    pthread_join(others[1], NULL);
    sem_destroy(semaphore);
    free(semaphore);
    return 0;
}

(Live on ideone)

请注意,使用rand使此选择实际上是伪随机的。摆脱沉睡的部分可以导致真正的随机选择,特别是当线程以前做过不同的事情时。 (虽然我可以想象一个人能够从外部影响线程以实现特定选择的情况)

答案 1 :(得分:0)

线程ID数组应服务于您的目的。使用rand()函数随机选择数组的索引。无论在您的阵列的索引处存储什么线程ID都应该是您选择的线程。