xtang的大侠们,又要麻烦你们了,请帮我一把:
我的程序1个server,1个client。每25ms server中的taskleader执行一次,每次server的taskleader执行后的10ms client的taskleader执行一次。我如果想达到目的:这么做可以吗?
在server的main()程序中创建两个时钟,一个设定为 25ms/25ms(发pulse 给server_taskleader),一个设定为35ms/25ms(发pulse给client_taskleader).我觉得这样做可能不准确,但想不到更好的solution,请明示。
我编的一个子线程示这样:
void *pthread (void *arg)
{
initialization
system("…");
com1=open("/dev/ser1", o_rdwr);
initialize_serial(com1, …);
while
{
pthread_mutex_liock (&mutex)
while(data_ready!)
{pthread_cond_wait(&condvar,&mutex);}
//process data…
data_ready=0;
pthread_cond_signal(&condvar);
pthread_mutex_unlock(&mutex);
}
问题是我想设定这个线程为RR, 所以要设定他的timeslice, 如果这个线程正在某个循环中,mutex已经被这个线程锁住,但这是timeslice用完了, 这是会发生什么呢? 如果这样,是不是和他对应的taskleader就不可能再次锁这个mutex并检验data_ready了(因为mutex已经被锁,且这个锁它的线程没在运行)?请您们指教一种方法避免这个问题的发生。
如果timeslice没有用尽就退出了,那么这个RRthread再次运行的话,是不是要重新被分配一个timeslice?
最后是一个关于优先级的问题,请问一个process的main thread的优先级是多少? 我有下面的程序
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <neutrino.h>
#include <sync.h>
int data_ready=0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;
void *
producer(void *notused)
{
printf(“In producer thread…\n”);
//get data from hardware
//we’ll simulate this with a sleep(1)
sleep(1);
printf(“producer: got data from h/w\n”);
pthread_mutex_lock(&mutex);
// while(data_ready){
// pthread_cond_wait(&condvar,&mutex);
// }
data_ready=1;
pthread_cond_signal (&condvar);
pthread_mutex_unlock (&mutex);
printf(“producer unlock mutex…\n”);
}
void *
consumer (void *notused)
{
printf(“In consumer thread…\n”);
while(1){
printf(“consumer lock mutex…\n”);
pthread_mutex_lock (&mutex);
while(!data_ready){
pthread_cond_wait(&condvar,&mutex);
printf(“consumer relock mutex…\n”); }
//process data
printf(“consumer: got data from producer\n”);
data_ready=0;
// pthread_cond_signal(&condvar);
pthread_mutex_unlock(&mutex);
printf(“consumer unlock mutex…\n”);
}
}
main ()
{
pthread_t producerid,consumerid;
pthread_attr_t producerattr,consumerattr;
pthread_attr_init(&consumerattr);
pthread_attr_init(&producerattr);
consumerattr.param.sched_priority=40;
producerattr.param.sched_priority=30;
printf(“Starting consumer/producer example…\n”);
//create the producer and consumer threads
pthread_create(&consumerid,&consumerattr,consumer,NULL);
pthread_create(&producerid,&producerattr,producer,NULL);
//let the threads run for a bit
sleep(6);
}
结果是
。
。
。
producer unlock mutex…
consumer relock mutex…
不明白为什么是这个顺序,既然consumer的优先级高,那么当producer unlock mutex之后,consumer就应该开始运行了,所以应该先出先consumer relock mutex 之后consumer运行完之后才会出现producer unlock mutex, 我发现只有用sched-yield才能达到这个目的,但这样靠优先级来preempt不行,究竟为什么呢?
问题很愚,麻烦您们受累了,实在是困扰了好极天,就是想不通!!!!谢谢xtang等专家们!!!