Hi, Looking at the rtl/unix/cthread.pp unit, I noticed two $Warning lines sayin that setting or getting thread priority is not implemented for any unix system. WHAT???
I then thought I would go ahead and do the implementation. Seeing that cthreads using libc and POSIX implementation, there was lots of docs about it on the net, but the deeper I went the more confused I got. In summary, this info is what I gathered so far: * Linux thread priority is VERY confusing (compared to Windows). * You have Static and Dynamic thread priority. * You also have various Thread Scheduling priorities (different from thread priorities). * Thread priority values range from -15..15. 15 being real-time 0 being normal -15 being idle When this range is applied, I have no idea! * Based on the scheduler used you also get other priority ranges. SCHED_OTHER has a range of 0 (no range) SCHED_FIFO (first in - first out) has a range of 1..99 SCHED_RR (round robin) has a range of 1..99 * Dynamic priority does not apply to processes with a non-zero static priority. WTF, I'm lost again! * Dynamic priorities have a range of -20..20 Just to f*ck with you even more, this range is now switched around. -20 is real-time 0 is normal 20 is idle * You can only set Dynamic priority with libc.setpriority() or libc.nice() * A normal user can only use the Thread Scheduler SCHED_OTHER, all others require super user rights. So no real-time apps for standard users. * NICE levels range from 4..-5 All this information comes from these URLs: * Linux Thread Priority http://www.midnightbeach.com/Kylix.Sidebar.3.html * Linux POSIX 1003.1c Thread Attribute Support http://www2.roguewave.com/support/docs/leif/sourcepro/html/threadspl/4-3.html * Java thread priority > Linux priority http://www.javamex.com/tutorials/threads/priority_what.shtml * Threads: Basic theory and libraries http://www.cs.cf.ac.uk/Dave/C/node29.html#SECTION0029414000000000000000 NOTE: the last one shows an example implementation for thread priority. I tried to translate that into Object Pascal or the cthreads implementation shown below I have created a Thread Manager demo that can use various Synchronization Methods and Thread Priorities. But in all cases, the thread priority doesn't seem to make any difference under Linux. I can see from the debug lines (writeln statements below) that the thread priorities are being set (seems to use the -20..20 range but wrong way round), but they all execute at the same speed on my Linux quad core system. http://opensoft.homeip.net/~graemeg/thread_manager.png Can anybody make heads or tails about thread priority under Linux (or any unix system for that matter). Is it possible to have various thread priorities or not under Linux? I use multi-threading a lot in my code, and assumed thread priority was implemented under FPC Linux, but looking at the original cthreads.pp unit, it clearly is not (for any unix platform). Is the following code correct? ---------------[ rtl/unix/cthreads.pp ]------------------------------- function CThreadSetPriority (threadHandle : TThreadID; Prio: longint): boolean; var param: sched_param; ret: integer; priority: integer; begin {.$Warning ThreadSetPriority needs to be implemented} writeln('DEBUG: CThreadSetPriority priority=', Prio); param.__sched_priority := Prio; priority := 0; { SCHED_OTHER is always used } ret := pthread_setschedparam(pthread_t(threadHandle), priority, @param); Result := (ret = 0); writeln('DEBUG: CThreadSetPriority - DONE'); end; function CThreadGetPriority (threadHandle : TThreadID): Integer; var param: sched_param; ret: integer; priority: longint; begin {.$Warning ThreadGetPriority needs to be implemented} writeln('DEBUG: CThreadGetPriority '); priority := 0; { SCHED_OTHER is always used } ret := pthread_getschedparam (pthread_t(threadHandle), @priority, @param); Result := param.__sched_priority; writeln('DEBUG: CThreadGetPriority (priority=', Result, ') - DONE'); end; -----------------------------[ end ]----------------------- Regards, - Graeme - -- fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal http://opensoft.homeip.net/fpgui/ _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel