【发布时间】:2016-09-07 22:16:10
【问题描述】:
在这里需要一些帮助。
我想了解这段代码发生了什么。
我正在尝试将随机数作为tickets 生成到在ccreate 函数内部创建的TCP_t 结构。
问题是,每次我在没有 srand(time(NULL)) 的情况下执行此代码时,它都会一遍又一遍地返回相同的 "random" 数字序列,例如:
TID: 0 | TICKET : 103
TID: 1 | TICKET : 198
所以我用时间播种,生成真正的随机数。
当我将种子放入 newTicket 函数中时,它会在每次执行中带来不同的数字,但每个线程的数字相同。这是一个输出示例:
执行1:
TID: 0 | TICKET : 148
TID: 1 | TICKET : 148
执行 2:
TID: 0 | TICKET : 96
TID: 1 | TICKET : 96
所以,经过一番研究,我发现我不应该每次调用 rand 时都播种它,而只能在程序开始时播种一次。现在,将种子放入 main 函数后,它给了我分段错误,我不知道为什么。
这可能是一个愚蠢的问题,但我真的很想了解发生了什么。
不知何故,种子在搞什么鬼? 我错过了什么吗? 我应该以另一种方式生成随机数吗?
#include <ucontext.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX_TICKET 255
#define STACK_SIZE 32000
typedef struct s_TCB {
int threadId;
int ticket;
ucontext_t context;
} TCB_t;
void test();
int newTicket();
int newThreadId();
int ccreate (void* (*start)(void*), void *arg);
int threadId = 0;
int main(){
srand(time(NULL)); //<<<============== HERE = SEGMENTATION FAULT
ccreate((void*)&test, 0);
ccreate((void*)&test, 0);
}
int ccreate (void* (*start)(void*), void *arg){
if(start == NULL) return -1;
ucontext_t threadContext;
getcontext(&threadContext);
makecontext(&threadContext, (void*)start, 0);
threadContext.uc_stack.ss_sp = malloc(STACK_SIZE);
threadContext.uc_stack.ss_size = STACK_SIZE;
TCB_t * newThread = malloc(sizeof(TCB_t));
if (newThread == NULL) return -1;
int threadThreadId = newThreadId();
newThread->threadId = threadThreadId;
newThread->ticket = newTicket();
printf("TID: %d | TICKET : %d\n", newThread->threadId, newThread->ticket);
return threadThreadId;
}
int newThreadId(){
int newThreadId = threadId;
threadId++;
return newThreadId;
}
int newTicket(){
//srand(time(NULL)); //<<<============== HERE = IT PARTIALLY WORKS
return (rand() % (MAX_TICKET+1));
}
void test(){
printf("this is a test function");
}
感谢所有帮助我的人。
如果代码太难看,很抱歉。尽量简化它。
【问题讨论】:
-
只是OOC,你为什么连续两次用相同的参数调用
ccreate?您是否 100% 确定 seg 错误实际上是在seeds 的线路上? -
ccreate((void*)&test, 0);没有理由在这里投。 -
我没有
ucontext.h,所以我不得不删除所有的ccreate,但我没有seg vault。您确定 srand 是问题所在吗?你能举一个更小的例子吗? (stackoverflow.com/help/mcve) -
ccreate((void*)&test, 0);更有可能导致段错误,但它被误报为在 srand 线上
标签: c random time srand ucontext