I've been playing with threads and V8 too: <https://github.com/xk/node-threads-a-gogo> :-P
Cheers, -- Jorge. On 02/07/2012, at 13:46, mschwartz wrote: > I was toying with pthreads and V8 and it all pretty much works as I expected. > > The repo is here: > https://github.com/mschwartz/v8t > > It's a pretty small amount of code, so all the v8 API calls used are not so > obfuscated. > > The test program, test.js is: > > var NUM_THREADS = 1000; > var nnn = 0; > > var pthread = builtin.pthread; > > log(pthread); > > function Thread(fn) { > var args = []; > for (var i=1; i<arguments.length; i++) { > args.push(arguments[i]); > } > this.fn = fn; > this.args = args; > this.t = pthread.spawn(this.run, this); > } > Thread.prototype.run = function(me) { > me.fn.apply(me, me.args); > }; > > function thread(n) { > var nnnn = 0; > log('thread ' + n); > while (true) { > nnn++; > nnnn++; > log('thread ' + this.t + ' here ' + nnn + ' ' + nnnn); > } > } > > function tester(i, n) { > log(i + ' ' + n); > sleep(n); > log('TESTER ' + i + ' EXITING'); > } > > function main() { > var threads = []; > if (true ) { > log('spawning'); > new Thread(tester, 1, 5); > new Thread(tester, 2, 5); > new Thread(tester, 3, 6); > for (var i=0; i<NUM_THREADS; i++) { > threads.push(new Thread(thread, i)); > } > > while (true) { > var tid = pthread.wait(); > log('parent: ' + tid + ' exited'); > } > } > else { > log('here'); > } > } > > A couple of things to note: > > First, there is no actual "wait for any thread to exit" kind of functionality > in pthreads. I implemented my own using doubly linked lists and > pthread_cond_signal(). pthread_t may be radically different on various > operating systems, so I implemented my own threadId scheme, similar to PIDs. > > When I spawn 1000 threads, they don't seem to get equal treatment by the > scheduler. Sample output of the test.js program: > 81073 thread 514 here 85641 116 > 81073 thread 713 here 85642 37 > 81073 thread 712 here 85643 38 > 81073 thread 711 here 85644 39 > 81073 thread 710 here 85645 40 > 81073 thread 709 here 85646 41 > 81073 thread 515 here 85647 116 > 81073 thread 516 here 85648 116 > 81073 thread 517 here 85649 116 > 81073 thread 518 here 85650 116 > 81073 thread 519 here 85651 116 > 81073 thread 520 here 85652 116 > 81073 thread 521 here 85653 116 > 81073 thread 522 here 85654 116 > 81073 thread 523 here 85655 116 > 81073 thread 524 here 85656 116 > 81073 thread 525 here 85657 116 > 81073 thread 526 here 85658 116 > 81073 thread 527 here 85659 116 > 81073 thread 528 here 85660 116 > 81073 thread 529 here 85661 116 > 81073 thread 635 here 85662 104 > 81073 thread 634 here 85663 105 > 81073 thread 530 here 85664 116 > 81073 thread 531 here 85665 116 > 81073 thread 680 here 85666 67 > 81073 thread 679 here 85667 68 > 81073 thread 678 here 85668 69 > 81073 thread 532 here 85669 116 > 81073 thread 533 here 85670 116 > 81073 thread 741 here 85671 11 > 81073 thread 740 here 85672 12 > 81073 thread 739 here 85673 13 > > As you can see, the first 600 or so threads seem to get equal processor time, > while the remaining ones seem really starved for processor time. I'm not > sure if this is due to the OSX pthread scheduler algorithm (I tried all 3 > variants, not much difference) or something about how v8::Locker works. > > Anyhow, I hope the code is of interest to someone. > > > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
