473,402 Members | 2,072 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,402 software developers and data experts.

pthread_create error

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
Oct 21 '06 #1
9 7294
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

Oct 21 '06 #2
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
Oct 21 '06 #3
"Michael" <mc******@aol.comwrites:
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 ****************
Oct 21 '06 #4
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/LinuxTu...ixThreads.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

Oct 21 '06 #5

Gary Wessle wrote:
"Michael" <mc******@aol.comwrites:
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?
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.
>
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
*/

Oct 21 '06 #6
Gary Wessle <ph****@yahoo.comwrites:
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);

}
Oct 21 '06 #8
"Salt_Peter" <pj*****@yahoo.comwrites:
Gary Wessle wrote:
"Michael" <mc******@aol.comwrites:

[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
*/
thank you.

my point is to see how the 2 threads running concurrently, the setup
above does not show me that. it shows me that one thread runs after
the other finishes. after a bit of reading I realized that both
threads will not run concurrently unless one gives way to the other
which is possible using pthread_yield to put the current thread on the
bottom of the run queue. as this;

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

using namespace std;

void* print_a(void* data) {
cout << "a called\n";
string* a = static_cast<string*(data);
for ( int i=0; i<1000; 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<1000; 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, 0, print_a, pva );
iret2 = pthread_create ( &thr_b_ID, 0, print_b, pvb );

pthread_join (thr_a_ID, 0);
pthread_join (thr_b_ID, 0);

}
Oct 21 '06 #9
Gary Wessle wrote:
Gary Wessle <ph****@yahoo.comwrites:
>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);

}
Actually, threads will be swapped in & out in a normal
program.

pthread_yield() is almost never required in a real-world
multi-threaded program. The thread context changes
will be performed by the Unix/Linux kernel at the most
opportune times. There are reasons that pthread_yield()
is not documented in most recent implementations of
pthreads.

On a multi-processor system, pthread_yield() may actually
cause the program to thrash, as it swaps threads onto/off-of
the various processors.

Your example functions are not representative of
real-life thread functions. Yours perform very little
work in a very tight loop, then exit.
The 1st thread may finish before the 2nd thread
is even started.

Create more realistic thread functions, eg:

- one thread that runs forever monitoring a socket
for input & places the input on a queue.
- one or more threads that monitor the input queue,
remove the data, do something with it, then put
the results on an output queue.
- a thread that watches the output queue, picks new
data off of the output queue, and writes the data
to a socket/file/console.

All of the threads above should run forever (as long as the
program is running). Mutexes will be required to
control both read & write access to the various queues.

You may get additional help on threading in other
newsgroups:

comp.programming.threads
comp.os.linux.development.apps
comp.os.linux.development.system

Larry
Oct 21 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: nightowl | last post by:
Does anybodu know how to do it precisely
12
by: Huskier | last post by:
Hi all: I want to pass a class-member function to pthread_create, and my code is in the following, but I don't know how to pass myobj.thread_function to pthread_create function. #include...
13
by: deko | last post by:
I use this convention frequently: Exit_Here: Exit Sub HandleErr: Select Case Err.Number Case 3163 Resume Next Case 3376 Resume Next
7
by: p | last post by:
WE had a Crystal 8 WebApp using vs 2002 which we upgraded to VS2003. I also have Crystal 9 pro on my development machine. The web app runs fine on my dev machine but am having problems deploying....
1
by: usa777 | last post by:
There are pthread_create symbols in libphread.so, libthread.so and libc.so. The following symbols displayed with the nm command: Value Size Type Bind Other Shndx Name ...
1
by: erwann | last post by:
On a Linux platform: Hi, I am just trying to pass an integer as an argument to my start_routine when creating a thread with pthread_create: In my .h file: short portfd; void...
8
by: fantasticamir | last post by:
Guys, I want to call a pointer2function method in pthread_create... I do not know how to do that. here is the code... ..... void * EventInterface::receiveEvent(int x, void...
1
by: dshereck | last post by:
Hello, I implemented a simple c++ thread wrapper; it works in Linux, but fails in BSD. Here is the code. The idea is that an other class will inherit and implement the virtual methods Setup...
1
by: unclefester | last post by:
Could someone please explain to me the return type of pthread_create()'s 3rd parameter? I know it should be a function but I keep getting the error: argument of type 'void' (Test::)(void*)' does not...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.