LinuxQuestions.org
Download your favorite Linux distribution at LQ ISO.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 09-27-2016, 01:10 AM   #1
sumeet inani
Member
 
Registered: Oct 2008
Posts: 908
Blog Entries: 26

Rep: Reputation: 49
pthreads in C


hi
I am making a multithreaded application for mutiplying matrices
It involves a thread (say t0) being given the matrices (an mxn and nxp matrix)
It distributes element of matrix mxn to m*n threads , one to each .
then each column of second matrix (nxp) is given to n threads that form row one of mxn matrix . Processing occurs ... (I gave that unnecessary details as motive of my program)

Anyway , here is my code
I compile it using
gcc codefile.c -lpthread

Code:
#include<stdio.h>
#include<pthread.h>
struct array_with_length
{       int length;
        int *array;
};
pthread_t sa[16];

void* matrix_mult(void *arguments)
{       int i,arg_length;
        pthread_t myid=pthread_self();
        for(i=0;i<16;i++)
                if(pthread_equal(myid,sa[i]))
                {       //printf("\npthread[%d] speaking",i);
                        break;
                }
        if(arguments==NULL)
                printf("\npthread[%d] speaking .Got not work",i);
        else
        {       arg_length=((struct array_with_length*)arguments)->length;
                printf("\npthread[%d] speaking . Got a matrix of size %d\nNamely: ",i,arg_length);
                for(i=0;i<arg_length;i++)
                        printf("%d\t",((struct array_with_length*)arguments)->array[i]);
                printf("\n");
        }
        return NULL;
}
int main()
{       int i,j,err_on_pthread_creation;
        struct array_with_length awl;
        int source_array[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
        awl.length=16;
        awl.array=source_array;
        printf("\nour mesh will be :\n");
        for(i=0;i<4;i++)
        {       printf("\n");
                for(j=0;j<4;j++)
                        printf("\t%d",source_array[i][j]);
        }
        for(i=0;i<16;i++)
        {       if(i==0)
        {       if(i==0)
                        err_on_pthread_creation=pthread_create(&sa[i],NULL,&matrix_mult,&awl);
                else
                        err_on_pthread_creation=pthread_create(&sa[i],NULL,&matrix_mult,NULL);
                if(err_on_pthread_creation!=0)
                        printf("\nError while creating pthread[%d]",i);
                else
                        printf("\npthread[%d] created",i);
        }
        printf("\n\n");
        sleep(10);
        return 0;
}
It does not do much currently .
Just using 4x4 matrix as input and giving it to thread0 . other threads are idle .
I want to send data from one pthread to another . can't figure out ?

ASSUMPTIONS
(1)In my case a pthread will send data to another and recieve data (like pass by value between functions).I do not want pass by reference between pthreads because I am simulating parallel processing where each node is represented by a thread . So as far as possible , no shared memory .

(2)I want pthreads to find each other through a common global variable.

Last edited by sumeet inani; 09-27-2016 at 01:11 AM.
 
Old 09-27-2016, 06:28 AM   #2
sundialsvcs
LQ Guru
 
Registered: Feb 2004
Location: SE Tennessee, USA
Distribution: Gentoo, LFS
Posts: 10,659
Blog Entries: 4

Rep: Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939
You should be aware that a CPU-intensive operation such as matrix multiplication might well run slower in a threaded environment.
 
Old 09-27-2016, 08:13 AM   #3
jpollard
Senior Member
 
Registered: Dec 2012
Location: Washington DC area
Distribution: Fedora, CentOS, Slackware
Posts: 4,912

Rep: Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513
The more usual way is to use m threads (or n, whichever is smaller and only up to the number of processors you have minus 1) as you reduce the context switching requirements and increase the work each thread uses (less overhead). The only time m x n threads COULD work is if you had m x n processors... at which time the process overhead overwhelms the time to do the work.

To make the data available to all you have to pass a pointer to the arrays. This is because the arrays are on the stack. For matrix multiplication using shared data is reasonable. The input arrays are not changed, and the destination array only has one (or a row) of element(s) changed with a thread - and the other threads are not changing values in the same location.

If you are trying to pass data without shared memory, don't use pthreads - use an mpi implementation instead.
 
2 members found this post helpful.
Old 09-27-2016, 10:00 PM   #4
John VV
LQ Muse
 
Registered: Aug 2005
Location: A2 area Mi.
Posts: 17,624

Rep: Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651Reputation: 2651
if you have Nvidia cards look into CUDA
 
Old 09-29-2016, 10:47 PM   #5
sumeet inani
Member
 
Registered: Oct 2008
Posts: 908

Original Poster
Blog Entries: 26

Rep: Reputation: 49
jpollard.
In mesh structure , each of my pthreads has 4 neighbours so I can keep 4 global variables for each pthread . A pthread will keep checking its 4 variables regularly . If a pthread wants to send data to neighbour it will change contents of neighbour's relevant global variable. Can that approach work ?
It will involve some sort of locking mechanism so that while a pthread's global variable is being changed . It won't be accessible to pthread itself. Can you give tips on this ?

sundialsvcs,
it is kind of a project . efficiency etc. not an issue.

John VV,
I have to implement in C .

Thanks.
 
Old 09-30-2016, 05:27 AM   #6
jpollard
Senior Member
 
Registered: Dec 2012
Location: Washington DC area
Distribution: Fedora, CentOS, Slackware
Posts: 4,912

Rep: Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513Reputation: 1513
Quote:
Originally Posted by sumeet inani View Post
jpollard.
In mesh structure , each of my pthreads has 4 neighbours so I can keep 4 global variables for each pthread . A pthread will keep checking its 4 variables regularly . If a pthread wants to send data to neighbour it will change contents of neighbour's relevant global variable. Can that approach work ?
That is a different problem from matrix multiplication, and gets into some of the other synchronization primitives. It now depends on WHEN you can send data... Each thread is asynchronous - so now you have to have synchronizing operations. You don't use a spin on flag type of synchronization. It can work, but it wastes a HUGE amount of CPU time - and WON'T work if you only have one core as the other thread may never get a chance to run.
Quote:
It will involve some sort of locking mechanism so that while a pthread's global variable is being changed . It won't be accessible to pthread itself. Can you give tips on this ?
perhaps this will help: http://www.yolinux.com/TUTORIALS/Lin...YNCHRONIZATION
The full tutorial starts at http://www.yolinux.com/TUTORIALS/Lin...ixThreads.html

The real problem with the mesh is making sure you don't have a deadlock.
 
Old 09-30-2016, 08:34 AM   #7
sundialsvcs
LQ Guru
 
Registered: Feb 2004
Location: SE Tennessee, USA
Distribution: Gentoo, LFS
Posts: 10,659
Blog Entries: 4

Rep: Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939
All of the threads, since they are threads, should have immediate access to all of the same matrix-memory and I am frankly puzzled why they would need to "send messages to each other."

Really, the only possible rationale for using threads in matrix multiplication is in an effort to use all of the available CPU cores. But, in that case, you want the cores to be 100%-busy multiplying matrices, not engaged in message-passing semantics. This fundamentally a "CPU-bound" activity, and you want to keep it that way.
 
Old 11-05-2016, 05:56 PM   #8
DeeDeeK
Member
 
Registered: Jan 2016
Distribution: Ubuntu 14.04
Posts: 37

Rep: Reputation: Disabled
Mailboxs threads sending mail and having packages to be picked up

I understand wishing to simulate having separate nodes communicating by passing messages, which seems to be what you would like to do. The advice to use global variables when you don't wish to do so seem a little out of scope. Tho' my example actually depends on some, but in a way that uses semaphores (flags) to indicate message ready and message received, so it's a model applicable to totally separate computing nodes. In fact, I'm working on adapting it to working across a network, with many producers and an x server collate the data and put it one the screen-to simulate big, complex, non-deterministic systems. Semaphores allow nice, loosey-goosey asyn-synchonization. It's fun.

Here's what I have been doing. It works using pthreads or lthreads.

Check this out: http://lthread.readthedocs.io/en/latest/

Hasan Alayli is the author of this great little lightweight threading library. It even has non-blocking lightweight threads, so it's way cool. ALSO in this library is support for sockets programming using nonblocking threads for MESSAGE PASSING. You should really check it out. I'm using it a lot and it's fast, lightweight, and very simple.

here's some of my code and probably excessive comments? I've never tried to explain any programming to anybody ever before so please go easy on me.

I use a producer/consumer arrangement. The producer has one flag it can set to YES, for a package being ready for pickup. The consumer has one flag it can set to YES, meaning it is ready for another package.

The producer can set the consumer's YES flag to NO and the consumer can set the producer's YES flag to NO. While the consumer uses the producer's data, the producer is free to get the next package ready. Once delivered, the consumer starts using it and sets the flag saying to get another one ready for it to pick up-when the consumer is ready. Once ready the package just sits there until it's picked up. The producer doesn't start making a new one until the old one is picked up.

It is basically a kludged message passing algorithm. But the threads can exist on separate cores and they only share any one global between two threads. I worked my butt off trying to make this clear and cut out the irrelevant code so I hope it's helpful. It's helped me clarify to myself what the code does.

Code:
/******* below are the two data structures I use for inter-thread communication ***********
** actually, there is a global array but each element of the array serves as a mailbox*****
*** as the model goes. A consumer takes delivery of a package, a pointer in an array of****
*** pointers to struct thread_mailbox_package,  *******************************************
**** it depends on threads behaving and not accessing one another's mailboxes**************
** The producer makes up the package and sets the flag indicating it's ready for pickup****
** That's the message-passing -it's not synchronized. the consumer does its thing until****
** it's ready for a new package, the producer waits for a new order after it's delivered **
** it works very very well for me****/

/**this is the struct, which is typedef'd here, which has the flags and pointers to data **/

typedef struct thread_mailbox_package {

	int 			package_ready_for_pickup_flag;
	int 			package_order_flag;

	LGobject_t 		*package_being_delivered;
	LGobject_t 		*package_currently_used;

	struct object_data	*package_contents;

} thread_mailbox_package_type;


/*this is an array of pointers to the 'mailboxes' ---each thread has a number, it's index *
** into the array, for it's particular 'mailbox'*** these threads control sprites, btw****/

thread_mailbox_package_type	*sprite_threads[number_of_threads];


/*****here is the function called through pthread_create or lthread_create. If using lthread_create ********
***** the declaration wouldbe: void sprite_packaging_thread( etc.) *****************************************
*/

void* sprite_packaging_thread(void *data){

	(sprite_thread_data *)this_thread = data;

	/*****initialization, then enter a continuous loop, where it accepts data from another producer ********
	**** is delivered by another thread, which provides data for this thread's ongoing calculations ********

	for( ; ; ){

	/*thread-specific code including accepting packages of data    ***** 
	*			.
	*			.
	*			etc.,
	/** code which puts together this_thread's particular data. the thread does some calculating and*******
	** then sets the flag for pickup by consumer thread, in this case a 'mailman' that delivers data ******
	** to another consumer, and also draws on the screen with it ********
				 .
				etc.,
	/****here's how the package  from this thread is made available--by setting the flag, in the struct ***
	**  pointer, this_thread->package_ready_for_pickup  to yes. Afterward, it polls the consumer's flag ***
	**  this_thread_->package_order_flag, set to yes when the consumer is ready for another package *******/

		image__object_free(this_thread->sprite_image_for_delivery);

		this_thread->sprite_image_for_delivery = sprite_image_create( this_thread->base_image_data, frame_number, current_scale);
	
		this_thread->package_ready_for_pickup_flag = yes;

		while ((!this_thread_->package_order_flag) && (!quit)) { 

			usleep (checkflaginterval);
		}
		if(quit){
			/*thread self-terminating code */
			return NULL;
		}
	}/* this is the closing brace of the for( ; ; ) loop */



/*here is a bit of the consumer thread's code *****/


for(int i = 0; i < number_of_sprites; i++){

	if (sprite_threads[i]->package_ready_for_pickup_flag){

		sprite_graphic_free(sprite_threads[i]->package_currently_used);
		sprite_threads[i]->package_currently_used = sprite_threads[i]->package_being_delivered;
		sprite_threads[i]->package_ready_for_pickup_flag = no;
		sprite_threads[i]->package_order_flag = yes;
	}

	sprite_drawing_routine(sprite_threads[i]);
}

Last edited by astrogeek; 11-06-2016 at 01:51 AM. Reason: Redact email addr, add code tags
 
1 members found this post helpful.
Old 11-06-2016, 01:52 AM   #9
astrogeek
Moderator
 
Registered: Oct 2008
Distribution: Slackware [64]-X.{0|1|2|37|-current} ::12<=X<=15, FreeBSD_12{.0|.1}
Posts: 6,263
Blog Entries: 24

Rep: Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194
Moderator Response

@DeeDeeK - Your post included a third party's email address. To prevent unintentional spamming of that address I have edited it from your post. Please avoid doing that in future.

Also, please use [code]...[/code] tags around your example code to make it easier for others to read. Because I was already editing the post, I have done that for you in this case.

And please try to keep your contributions to this thread focused on the OP's requirements, which are fairly specific as stated. If you wish to introduce discussion of a different use case or model, you are encourged to start a separate thread for the purpose.

Please review the LQ Rules and Site FAQ for guidance.

Thanks!

Last edited by astrogeek; 11-06-2016 at 02:03 AM.
 
1 members found this post helpful.
Old 11-08-2016, 03:00 PM   #10
DeeDeeK
Member
 
Registered: Jan 2016
Distribution: Ubuntu 14.04
Posts: 37

Rep: Reputation: Disabled
Quote:
ASSUMPTIONS
(1)In my case a pthread will send data to another and recieve data (like pass by value between functions).I do not want pass by reference between pthreads because I am simulating parallel processing where each node is represented by a thread . So as far as possible , no shared memory .

(2)I want pthreads to find each other through a common global variable.
I apologize for the overeagerness and carelessness in earlier post. I am quite new to participating in forums such as this, and I feel very apologetic. I will read and observe rules and guidelines as well I can.

As I understand it you want to use a policy-a channel to send data via messages between threads, translatable to messages between compute nodes on a network. Sockets may be much slower than shared memory but you specify no shared memory, and sockets can be used across physical networks and also within a single computer. Mechanism: sockets. I refer you to Wikipedia's article on Inter-process communication, which covers semaphores, sockets and many more related mechanisms.

The quote below is from the Lthread 1.0 documentation, and it seems to address some of your specific needs as per your ASSUMPTIONS(1)
Quote:
lthread is a multicore/multithread coroutine library written in C. It uses ...'s... _swap function to swap lthreads. What’s special about lthread is that it allows you to make blocking calls and expensive computations, blocking IO inside a coroutine, providing you with the advantages of coroutines and pthreads. See the http server example below.
The blocking IO mentioned in this quote is network IO, which can be used between threads and processes on a single computer.

One use of the lthread library are the sockets functions, which provide a simple way to create and use sockets and pipes for interprocess, or inter-thread, communication. Your pthreads can use these to communicate with one another in a way which can be used across a real network. No shared memory. As you may see in the above quote, this may be useful

Quote:
jpollard.
... each of my pthreads has 4 neighbours ... 4 global variables for each pthread . A pthread will keep checking its 4 variables regularly . If a pthread wants to send data to neighbour it will change contents of neighbour's relevant global variable....
It will involve some sort of locking mechanism so that while a pthread's global variable is being changed . It won't be accessible to pthread itself. Can you give tips on this ?
You could use a mutex ... The pthreads library has mutexes for controlling access to shared variables. This is a part of the POSIX standard and seems to be just what you're asking for? For my purposes, which floating point operations on a 2-D array of data quickly, across several cores, mutexes are too slow. So two simple semaphores controlling access to a specific, single, shared structure. Logically, it's simply passing a message, with "ready to receive" and a "ready to send" signals rather than allowing all threads unregulated access to a common pool of data in shared memory.

Last edited by DeeDeeK; 11-08-2016 at 03:16 PM.
 
Old 11-08-2016, 03:35 PM   #11
astrogeek
Moderator
 
Registered: Oct 2008
Distribution: Slackware [64]-X.{0|1|2|37|-current} ::12<=X<=15, FreeBSD_12{.0|.1}
Posts: 6,263
Blog Entries: 24

Rep: Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194
Quote:
Originally Posted by DeeDeeK View Post
I apologize for the overeagerness and carelessness in earlier post. I am quite new to participating in forums such as this, and I feel very apologetic. I will read and observe rules and guidelines as well I can.
No need for any apology, you were not being scolded, only gently reminded. I am sorry if it seemed more than that.

Your participation, contributions and eagerness are very welcome here at LQ!

Thank you for your thoughtful reply!
 
1 members found this post helpful.
Old 11-10-2016, 01:44 PM   #12
DeeDeeK
Member
 
Registered: Jan 2016
Distribution: Ubuntu 14.04
Posts: 37

Rep: Reputation: Disabled
Thank you, astrogeek. You were not harsh in any way, I'm just very, ummm, sensitive. I like getting things right in social situations.

A book I just found in the public library of all places, seems like it might be helpful: An Introduction to Parallel Programming, by Peter S. Pacheco.

It addresses pthread, MPI, and OpenMP using a tutorial approach and has actual code for examples and it looks like some interesting challenges. It says it focuses on design, debugging, and evaluating performance of both distributed (like separate computer nodes) and shared memory programs.

Forgive me if I seem to harp on this, but this topic is a large part of my own project, which maybe I ought to start a thread about.

Anyhow, I hope this resource comes in useful for anyone interesting in parallel processing.
 
Old 11-11-2016, 03:52 AM   #13
astrogeek
Moderator
 
Registered: Oct 2008
Distribution: Slackware [64]-X.{0|1|2|37|-current} ::12<=X<=15, FreeBSD_12{.0|.1}
Posts: 6,263
Blog Entries: 24

Rep: Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194Reputation: 4194
Quote:
Originally Posted by DeeDeeK View Post
Thank you, astrogeek. You were not harsh in any way, I'm just very, ummm, sensitive. I like getting things right in social situations.
Thanks for the kind reply, and you are welcome.

Social interaction via text-only medium can be awkward at times. But as long as we are all genuinely respectful of others, we can maintain a happy equillibrium, even with the occasional bump! It doesn't get much more right than that!

Quote:
Originally Posted by DeeDeeK View Post
A book I just found in the public library of all places, seems like it might be helpful: An Introduction to Parallel Programming, by Peter S. Pacheco.
Thanks for the book reference, hopefully others will find it useful as well.

Quote:
Originally Posted by DeeDeeK View Post
Forgive me if I seem to harp on this, but this topic is a large part of my own project, which maybe I ought to start a thread about.
By all means, you are always encouraged to start your own threads for your own topics. That is what LQ is for!

In case you are not aware of it, as an LQ member you also have a blog here at LQ. Many members use their blogs for posting their projects, book reviews, tutorials, etc. Find links in the main menus and in your member profile menus. Good luck!
 
1 members found this post helpful.
Old 11-11-2016, 08:04 AM   #14
sundialsvcs
LQ Guru
 
Registered: Feb 2004
Location: SE Tennessee, USA
Distribution: Gentoo, LFS
Posts: 10,659
Blog Entries: 4

Rep: Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939Reputation: 3939
I perceive a timing problem in the use of global flags in post #8 of this thread.

If you are using a cooperative multitasker in which threads cannot be pre-empted (and nothing is being set in a signal/interrupt routine), then you can use flags in this way as status indicators. But, generally, I suggest using a queue.

Also, flags should be used, not as a definite indicator that "you have something to do," but rather as an indicator that "you should not be asleep right now because you might have something to do." Condition-variables are a good way to do this sort of thing in traditional threading systems. They are, in effect, "the little red flag on the mailbox," which indicates to the driver that the box should be opened because it might have a piece of outbound mail in it.

The condition ("the little red flag") is something that you can wait on, simply so that you do not "busy wait." When the flag is raised, you lower it again and then you open the mailbox. You continue servicing the mailbox until you find that it is empty, then you wait on the condition again ... knowing that you might immediately wake-up and find the mailbox empty (because the condition had been signaled while you were still awake).

When using threads, of any sort, I think that it's most important that each thread minds its own business. It notifies other threads of things that those threads might need to attend to, but makes no assumption as to precisely when they will do it. This is one reason why queues are so very useful ... as we well know when we use the "pipe" symbol on the Linux/Unix command-line.
 
1 members found this post helpful.
Old 12-14-2016, 06:51 PM   #15
DeeDeeK
Member
 
Registered: Jan 2016
Distribution: Ubuntu 14.04
Posts: 37

Rep: Reputation: Disabled
Wink

sundialsvcs wrote:
Quote:
When using threads, of any sort, I think that it's most important that each thread minds its own business. It notifies other threads of things that those threads might need to attend to, but makes no assumption as to precisely when they will do it
I do so agree. I'm afraid what I shared in post #8 was lacking in coherency, brevity, and clarity. The application doesn't depend on accurate timing at all, at least not in the sense of the visual display.

That example was poorly snipped and adapted from an application which can be compiled conditionally either to use only pthreads or pthreads and lthreads together, equally well.

The threads don't know or care whether they are preemptive and they make only two assumptions. One: the consumer, which updates the contents of a window, checks for sprites from each thread but doesn't care if or when they are available because the sprite drawing function accepts NULL. Two: The producers don't need to find the consumer-ready flag set, they just check to see if it is, but busy-waiting in this particular application this makes sense.

Seen from afar, it looks like this application will do a lot of busy-waiting and an empty display, but it doesn't. As it is designed, the consumer-ready flag is always up by the second time the producer checks, without fail. It is far simpler in this particular case to just check the flag once or at most twice with a few milliseconds sleep in between. As for an empty window, with no sprites, that would be an interesting, even unusual result, but a valid one. The sprites are being used to visualize the activity of a complex system in code. It might do nothing, or just change really slow, or 'die.' It's kind of like a-life but not quite.

None of the threads are actually told by another thread what to do or when. The lightweight threads don't all run on the same scheduler. There are as many lthread schedulers-each running in its own pthread- as there are available cores. Those pthreads don't migrate and the load is very evenly balanced by the application in cooperation with the kernel.

Not every piece of software needs accurate timing. The simplicity of the two flag system outweighs all other considerations here. It's like pachinko; all the balls always get to the bottom.

This wouldn't work very well for a multiplayer, first person shooter across a network, huh? ;-)

I'ma start a new thread or maybe a blog related to this.

I apologize for diverting us away from matrix multiplication. But if the application doesn't depend in any way on timing other than to go faster, perhaps my kiss (keep it simple, stupid) approach might actually be helpful?
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
[SOLVED] [Pthreads]Usage of Conditions Variables with Pthreads Aquarius_Girl Programming 2 01-14-2013 05:40 AM
pthreads manaila Linux - Newbie 1 07-01-2011 11:59 AM
Pthreads christheavatar Programming 4 03-05-2005 09:30 PM
pthreads ftgow Linux - Software 0 07-08-2004 03:55 AM
pthreads socket9001 Programming 2 12-29-2003 12:23 AM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 08:58 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration