C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

pthread_create error

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
Gary Wessle
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: pthread_create error Reply with quote



Hi

I am trying to understand how pthread is used, so I make the scenario
below, I could not understand the erros by reading the man
pthread_create.

//**************** code start ****************
#include <iostream>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <pthread.h>

using namespace std;

void print_a(){
for ( int i=0; i<10; i++)
cout << "a";
}

void print_b(){
for ( int i=0; i<10; i++)
cout << "b";
}


int main(){

pthread_t thr_a_ID;
pthread_create ( &thr_a_ID, NULL, print_a, NULL );

pthread_t* thr_b_ID;
pthread_create ( &thr_b_ID, NULL, print_b, NULL );
}
//**************** code end ****************

**************** error ****************
main.cpp:23: error: invalid conversion from ¡Ævoid (*)()¡Ç to ¡Ævoid*
(*)(void*)¡Ç
main.cpp:23: error: initializing argument 3 of ¡Æint
pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*),
void*)¡Ç
main.cpp:26: error: cannot convert ¡Æpthread_t**¡Ç to ¡Æpthread_t*¡Ç
for argument ¡Æ1¡Ç to ¡Æint pthread_create(pthread_t*, const
pthread_attr_t*, void* (*)(void*), void*)¡Ç

make: *** [main.o] Error 1
****************************************************************

I tried to change argument 3 of pthread_create to &print_a.


thanks
Back to top
Michael
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: Re: pthread_create error Reply with quote



Quote:
void print_a(){
for ( int i=0; i<10; i++)
cout << "a";
}

void print_b(){
for ( int i=0; i<10; i++)
cout << "b";
}


int main(){

pthread_t thr_a_ID;
pthread_create ( &thr_a_ID, NULL, print_a, NULL );

pthread_t* thr_b_ID;
pthread_create ( &thr_b_ID, NULL, print_b, NULL );
}
//**************** code end ****************

**************** error ****************
main.cpp:23: error: invalid conversion from 'void (*)()' to 'void*
(*)(void*)'
main.cpp:23: error: initializing argument 3 of 'int
pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*),
void*)'
main.cpp:26: error: cannot convert 'pthread_t**' to 'pthread_t*'
for argument '1' to 'int pthread_create(pthread_t*, const
pthread_attr_t*, void* (*)(void*), void*)'

make: *** [main.o] Error 1
****************************************************************

I don't know anything about pthreads, but here's what your compiler is
telling you:

Error on line 23:
print_a needs to look like this:

void* print_a(void* data) {
// Do something and return something
}

Error on line 26:
Quote:
pthread_t* thr_b_ID;
Get rid of *.


Michael
Back to top
Gary Wessle
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: Re: pthread_create error Reply with quote



here is the makefile to run the code

LDFLAGS = -lpthread
CXXFLAGS = -gdwarf-2
OBJS := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
COMP = g++

proj: $(OBJS)
$(COMP) -Wall -gdwarf-2 -o proj $(OBJS) $(LDFLAGS)

#-Wall turns on all warnings
#-gdwarf-2 for dubugging note gdb manual 12.4.1
clean:
rm -rf *.o proj
Back to top
Gary Wessle
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: Re: pthread_create error Reply with quote

"Michael" <mchlgibs (AT) aol (DOT) com> writes:

Quote:
void print_a(){
for ( int i=0; i<10; i++)
cout << "a";
}

void print_b(){
for ( int i=0; i<10; i++)
cout << "b";
}


int main(){

pthread_t thr_a_ID;
pthread_create ( &thr_a_ID, NULL, print_a, NULL );

pthread_t* thr_b_ID;
pthread_create ( &thr_b_ID, NULL, print_b, NULL );
}
//**************** code end ****************

**************** error ****************
main.cpp:23: error: invalid conversion from 'void (*)()' to 'void*
(*)(void*)'
main.cpp:23: error: initializing argument 3 of 'int
pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*),
void*)'
main.cpp:26: error: cannot convert 'pthread_t**' to 'pthread_t*'
for argument '1' to 'int pthread_create(pthread_t*, const
pthread_attr_t*, void* (*)(void*), void*)'

make: *** [main.o] Error 1
****************************************************************

I don't know anything about pthreads, but here's what your compiler is
telling you:

Error on line 23:
print_a needs to look like this:

void* print_a(void* data) {
// Do something and return something
}

Error on line 26:
pthread_t* thr_b_ID;
Get rid of *.

Michael

thanks,
I fixed the code but it is not doing what I expected it to do, which
is print out aa(s) and bb(s).

//**************** code v 1.0 start ****************
#include <iostream>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <pthread.h>

using namespace std;

void* print_a(void* data) {
char* a = (char*) data;
for ( int i=0; i<10; i++)
cout << *a;
}

void* print_b(void* data){
char* b = (char*) data;
for ( int i=0; i<10; i++)
cout << *b;
}


int main(){
char* a = "aa";
void * pva = (void*) a;
pthread_t thr_a_ID;
pthread_create ( &thr_a_ID, NULL, print_a, pva );

char* b = "bb";
void* pvb = (void*) b;
pthread_t thr_b_ID;
pthread_create ( &thr_b_ID, NULL, print_b, pvb );
}
//**************** code v 1.0 end ****************
Back to top
Salt_Peter
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: Re: pthread_create error [OT] Reply with quote

Gary Wessle wrote:
Quote:
"Michael" <mchlgibs (AT) aol (DOT) com> writes:

void print_a(){
for ( int i=0; i<10; i++)
cout << "a";
}

void print_b(){
for ( int i=0; i<10; i++)
cout << "b";
}


int main(){

pthread_t thr_a_ID;
pthread_create ( &thr_a_ID, NULL, print_a, NULL );

pthread_t* thr_b_ID;
pthread_create ( &thr_b_ID, NULL, print_b, NULL );
}
//**************** code end ****************

**************** error ****************
main.cpp:23: error: invalid conversion from 'void (*)()' to 'void*
(*)(void*)'
main.cpp:23: error: initializing argument 3 of 'int
pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*),
void*)'
main.cpp:26: error: cannot convert 'pthread_t**' to 'pthread_t*'
for argument '1' to 'int pthread_create(pthread_t*, const
pthread_attr_t*, void* (*)(void*), void*)'

make: *** [main.o] Error 1
****************************************************************

I don't know anything about pthreads, but here's what your compiler is
telling you:

Error on line 23:
print_a needs to look like this:

void* print_a(void* data) {
// Do something and return something
}

Error on line 26:
pthread_t* thr_b_ID;
Get rid of *.

Michael

thanks,
I fixed the code but it is not doing what I expected it to do, which
is print out aa(s) and bb(s).

//**************** code v 1.0 start ****************
#include <iostream
#include <ctime
#include <cstdio
#include <cstdlib
#include <pthread.h

using namespace std;

void* print_a(void* data) {
char* a = (char*) data;
for ( int i=0; i<10; i++)
cout << *a;
}

void* print_b(void* data){
char* b = (char*) data;
for ( int i=0; i<10; i++)
cout << *b;
}


int main(){
char* a = "aa";

shouldn't that array have 10 characters?

Quote:
void * pva = (void*) a;
pthread_t thr_a_ID;
pthread_create ( &thr_a_ID, NULL, print_a, pva );

At this point, since the return values are not collected, main does not
wait for the above thread to be terminated. And neither has the thread
been joined.

Quote:

char* b = "bb";
void* pvb = (void*) b;
pthread_t thr_b_ID;
pthread_create ( &thr_b_ID, NULL, print_b, pvb );
}
//**************** code v 1.0 end ****************

[Off Topic]

Instead of printing from seperate threads, where a race condition can
diffuse the output if not outright fail, lets have a couple of threads
do a little work instead.

#include <iostream>
#include <pthread.h>

// this function will load a char array[10] with chars from a to j
void* load_carray(void* p_data)
{
char* p_array = static_cast<char*>(p_data);
char c = 'a';
for (int i=0; i< 10; i++)
*(p_array++) = c++;
return 0;
}

// this function loads an int array[10] from 0 to 9
void* load_narray(void* p_data)
{
int* p_narray = static_cast<int*>(p_data);
for (int i=0; i< 10; i++)
*(p_narray++) = i;
return 0;
}

// function prints any array - deduced parameters
template< typename T , const size_t Size>
void print_t(T(&array)[Size])
{
for(size_t i = 0; i < Size; ++i)
{
std::cout << array[i];
}
std::cout << std::endl;
}

int main()
{
char carray[10] = { 'z' }; // char[] for thread 0
int narray[10] = { 0 }; // int[] fot thread 1
// threadID array and result array
pthread_t threadID[2];
int result[2];
// create threads with PTHREAD_CREATE_JOINABLE - the default
result[0] = pthread_create( &threadID[0],
0, // PTHREAD_CREATE_JOINABLE
load_carray,
carray );
result[1] = pthread_create( &threadID[1],
0, // PTHREAD_CREATE_JOINABLE
load_narray,
narray );
// wait for both threads to be created and complete
pthread_join( threadID[0], 0);
pthread_join( threadID[1], 0);
// display threadID and results
for(int n = 0; n < 2; ++n)
{
std::cout << "threadID " << threadID[ n ];
std::cout << "\nresult: " << result[ n ] << std::endl;
}
// lets see the initialized arrays
print_t( carray );
print_t( narray );

return 0;
}

/*
threadID 1084229952
result: 0
threadID 1094719808
result: 0
abcdefghij
0123456789
*/
Back to top
Tomekstasiowski@buziaczek
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: Re: pthread_create error Reply with quote

http://s9.bitefight.pl/c.php?uid=91452
Back to top
Gary Wessle
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: Re: pthread_create error Reply with quote

Gary Wessle <phddas (AT) yahoo (DOT) com> writes:

Quote:
here is the makefile to run the code

LDFLAGS = -lpthread
CXXFLAGS = -gdwarf-2
OBJS := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
COMP = g++

proj: $(OBJS)
$(COMP) -Wall -gdwarf-2 -o proj $(OBJS) $(LDFLAGS)

#-Wall turns on all warnings
#-gdwarf-2 for dubugging note gdb manual 12.4.1
clean:
rm -rf *.o proj

for the records:
the Fix:

#include <iostream>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <pthread.h>

using namespace std;

void* print_a(void* data) {
pthread_yield(); // send to end of run queue
cout << "a called\n";
string* a = static_cast<string*> (data);
for ( int i=0; i<10; i++) {
cout << *a;
pthread_yield();
}
cout << "--a finihed\n";
}

void* print_b(void* data){
cout << "b called\n";
string* b = static_cast<string*> (data);
for ( int i=0; i<10; i++) {
cout << *b;
pthread_yield();
}
cout << "--b finihed\n";
}

int main(){

pthread_t thr_a_ID, thr_b_ID;
string a = "aa";
string b = "bb";
int iret1, iret2;
void * pva = static_cast<void*> (&a);
void* pvb = static_cast<void*> (&b);

iret1 = pthread_create ( &thr_a_ID, NULL, print_a, pva );
iret2 = pthread_create ( &thr_b_ID, NULL, print_b, pvb );

pthread_join (thr_a_ID, NULL);
pthread_join (thr_b_ID, NULL);

}
Back to top
Michael
Guest





PostPosted: Sat Oct 21, 2006 9:10 am    Post subject: Re: pthread_create error Reply with quote

Quote:
thanks,
I fixed the code but it is not doing what I expected it to do, which
is print out aa(s) and bb(s).

You may need to post this to a pthreads-specific group to get better
help.

Like I said, I don't know anything about pthreads. From a little
googling, though, I came on this site:
http://yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
which leads me to believe you need to do a pthread_join on each of the
two threads you just created. But I could be totally wrong.

Michael
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.