Note that there are some explanatory texts on larger screens.

plurals
  1. POSemaphore waiting case
    primarykey
    data
    text
    <p>I want to make sure my sempahore do what I expect to do, but I can't bring it to the state where one or more threads wait. I need that only 3 threads at a time to be able to work over the linked list.</p> <p>code:</p> <pre><code>#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;pthread.h&gt; #include &lt;unistd.h&gt; #include &lt;math.h&gt; #include &lt;semaphore.h&gt; struct dataBlock{ struct node *root; int listSize; int forIndex; }; struct node { // std linked list node int value; int worker; struct node *next; }; int limit = 5; sem_t sem; pthread_mutex_t mutp = PTHREAD_MUTEX_INITIALIZER; // mutex pthread_cond_t condvar = PTHREAD_COND_INITIALIZER; //condvar void *deleteDoneNodes(struct node *n){ struct node *root = n; struct node *it = root; struct node *prev = NULL; do{ if(it-&gt;value == 1){ struct node *next = it-&gt;next; if (prev != NULL) { prev-&gt;next = next; } if (it == root) { root = next; } free(it); it = next; } else { prev = it; it = it-&gt;next; } }while(it != NULL); return root; } void * worker( void *data ){ //get list int wFlag; struct dataBlock *inData = ( struct dataBlock * ) data; struct node *root = inData-&gt;root; int forIndex = inData -&gt;forIndex; free(data); while(1){ if( sem_wait( &amp;sem ) != 0 ){ printf( " &gt; waiting... \n" ); } // pthread_mutex_lock( &amp;mutp ); struct node *it = root; do{ if( forIndex == it-&gt;worker ){ if( it-&gt;value &gt; 2 ){ while( it-&gt;value != 1 ) it-&gt;value = sqrt(it-&gt;value); } } else{ // printf("Not sqrt-able node %d\n",it-&gt;value); } it = it-&gt;next; }while(it != NULL); // pthread_cond_signal( &amp;condvar ); // pthread_mutex_unlock( &amp;mutp ); sem_post(&amp;sem); // sleep(100); // "create" concurrancy envi. pthread_exit(0); } return NULL; } int main( int argc, char *argv[] ){ if ( argc != 3 ){ printf( "Programm must be called with \n NR of elements and NR of workers! \n " ); exit( 1 ); } int i; struct node *root; struct node *iterator; //prepare list for task int listSize = atoi(argv[1]); int nrWorkers = atoi(argv[2]); root = malloc(sizeof( struct node) ); root-&gt;value = rand() % 100; root-&gt;worker = 0; iterator = root; for( i=1; i&lt;listSize; i++ ){ iterator-&gt;next = malloc(sizeof(struct node)); iterator = iterator-&gt;next; iterator-&gt;value = rand() % 100; iterator-&gt;worker = i % nrWorkers; printf("node #%d worker: %d value: %d\n", i, iterator-&gt;worker,iterator-&gt;value); } iterator-&gt;next = NULL; printf("? List got populated\n"); // init semaphore &gt; keeps max 3 threads working over the list if( sem_init(&amp;sem,0,3) &lt; 0){ perror("semaphore initilization"); exit(0); } // Create all threads to parse the link list int ret; pthread_mutex_init(&amp;mutp,NULL); pthread_t w_thread; pthread_t* w_threads = malloc(nrWorkers * sizeof(w_thread)); for( i=0; i &lt; nrWorkers; i++ ){ struct dataBlock *data = malloc(sizeof(struct dataBlock)); data-&gt;root = root; data-&gt;listSize = listSize; data-&gt;forIndex = i; ret = pthread_create ( &amp;w_threads[i], NULL, worker, (void *) data ); if( ret ) { perror("Thread creation fail"); exit(2); } } deleteDoneNodes( root ); int join; for ( i = 0; i &lt; nrWorkers; i++ ){ join = pthread_join(w_threads[i],NULL); } iterator = root; for ( i = 0; i &lt; listSize; i++){ printf("val: %d worker: %d _ \n", iterator-&gt;value, iterator-&gt;worker); iterator = iterator-&gt;next; } free(root); free(iterator); sem_destroy(&amp;sem); return 0; } </code></pre> <p>terminal~> ./s 16 16</p> <pre><code>node #1 worker: 1 value: 86 node #2 worker: 2 value: 77 node #3 worker: 3 value: 15 node #4 worker: 4 value: 93 node #5 worker: 5 value: 35 node #6 worker: 6 value: 86 node #7 worker: 7 value: 92 node #8 worker: 8 value: 49 node #9 worker: 9 value: 21 node #10 worker: 10 value: 62 node #11 worker: 11 value: 27 node #12 worker: 12 value: 90 node #13 worker: 13 value: 59 node #14 worker: 14 value: 63 node #15 worker: 15 value: 26 ? List got populated val: 1 worker: 0 _ val: 1 worker: 1 _ val: 1 worker: 2 _ val: 1 worker: 3 _ val: 1 worker: 4 _ val: 1 worker: 5 _ val: 1 worker: 6 _ val: 1 worker: 7 _ val: 1 worker: 8 _ val: 1 worker: 9 _ val: 1 worker: 10 _ val: 1 worker: 11 _ val: 1 worker: 12 _ val: 1 worker: 13 _ val: 1 worker: 14 _ val: 1 worker: 15 _ </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload