我需要随机选择三个线程中的两个,我想出了一些想法,但我不确定它们是否会起作用。
拥有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;
}
答案 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;
}
请注意,使用rand
使此选择实际上是伪随机的。摆脱沉睡的部分可以导致真正的随机选择,特别是当线程以前做过不同的事情时。 (虽然我可以想象一个人能够从外部影响线程以实现特定选择的情况)
答案 1 :(得分:0)
线程ID数组应服务于您的目的。使用rand()函数随机选择数组的索引。无论在您的阵列的索引处存储什么线程ID都应该是您选择的线程。