Hi all.
I have a socket. I want to create two threads, one is to read from socket, and another is to write to socket. However, I want these two threads to be able to share the same data, so I created a mutex to lock the resource.
I don't know what happens with my two threads, but it always quits after it did some tasks. -
#include "camel.h"
-
#include "irc.h"
-
-
pthread_t gtid;
-
pthread_mutex_t gMutex;
-
-
// The shared resource between reading and writing thread
-
char gSntBuffer[MAX_SIZE_BUFFER];
-
-
void*
-
SendRequest( INPUT void* pArg)
-
{
-
int lsockfd;
-
DBGSTR(3,
-
STATUS_SUCCESS,
-
"FUNCTION ENTRY",
-
"")
-
lsockfd = (int)pArg;
-
while(1)
-
{
-
pthread_mutex_lock(&gMutex);
-
-
if (gSntBuffer)
-
{
-
#ifdef DBG
-
printf("Snt Buffer : %s\n", gSntBuffer);
-
#endif
-
write(lsockfd, gSntBuffer, MAX_SIZE_BUFFER);
-
}
-
-
pthread_mutex_unlock(&gMutex);
-
}
-
DBGSTR(3,
-
STATUS_SUCCESS,
-
"FUNCTION EXIT",
-
"")
-
}
-
-
void*
-
ReceiveReply( INPUT void* pArg)
-
{
-
int lsockfd = (int)pArg;
-
char lRcvBuffer[MAX_SIZE_BUFFER];
-
int lBytes = 0;
-
DBGSTR(3,
-
STATUS_SUCCESS,
-
"FUNCTION ENTRY",
-
"")
-
while(1)
-
{
-
lBytes = read(lsockfd, lRcvBuffer, MAX_SIZE_BUFFER);
-
#ifdef DBG
-
printf("Rcv Buffer : %s", lRcvBuffer);
-
#endif
-
// here I have to filter the lRcvBuffer and
-
// then write something back to socket by filling
-
// the gSntBuffer only and let the SendRequest()
-
// do the rest of the job.
-
//
-
-
// .... CODE HERE
-
}
-
DBGSTR(3,
-
STATUS_SUCCESS,
-
"FUNCTION EXIT",
-
"")
-
}
-
-
tRtnCode
-
ConnectIRC( INPUT tProfile profile )
-
{
-
int lsockfd;
-
struct sockaddr_in lservaddr;
-
int lrvalue;
-
-
pthread_attr_t lattr;
-
-
DBGSTR(3,
-
STATUS_SUCCESS,
-
"FUNCTION ENTRY",
-
"")
-
-
memset(&lservaddr, 0, sizeof(lservaddr));
-
lservaddr.sin_family = AF_INET;
-
lservaddr.sin_port = htons(profile.port);
-
lservaddr.sin_addr.s_addr = inet_addr(profile.server);
-
-
if (0 >= (lsockfd = socket(AF_INET, SOCK_STREAM,0)))
-
{
-
DBGINT(1,
-
ERROR_SOCK_CANNOT_CREATE,
-
"lsockfd = ",
-
lsockfd)
-
return (ERROR_SOCK_CANNOT_CREATE);
-
}
-
-
printf("SendRequest() : losckfd = %d\n", lsockfd);
-
-
if (0 < (lrvalue = connect(lsockfd, (struct sockaddr*)&lservaddr, sizeof(lservaddr))))
-
{
-
DBGINT(1,
-
ERROR_SOCK_CANNOT_CONNECT,
-
"connect() returns ",
-
lrvalue)
-
return (ERROR_SOCK_CANNOT_CONNECT);
-
}
-
-
// set attributes
-
pthread_attr_init(&lattr);
-
pthread_attr_setdetachstate(&lattr, PTHREAD_CREATE_DETACHED);
-
pthread_attr_setscope(&lattr, PTHREAD_SCOPE_SYSTEM);
-
-
// init mutex
-
pthread_mutex_init(gMutex, NULL);
-
pthread_mutex_lock(&gMutex);
-
-
snprintf(gSntBuffer,
-
MAX_SIZE_BUFFER,
-
IRC_USER,
-
profile.username,
-
"",
-
"",
-
profile.fullname,
-
profile.nickname);
-
-
pthread_mutex_unlock(&gMutex);
-
-
// create 2 threads
-
// - read data
-
// - write data
-
-
pthread_create(>id, &lattr, SendRequest, (void*)lsockfd);
-
pthread_create(>id, &lattr, ReceiveReply, (void*)lsockfd);
-
-
DBGSTR(3,
-
STATUS_SUCCESS,
-
"FUNCTION EXIT",
-
"")
-
}
5 7237 Banfa 9,065
Expert Mod 8TB
It's not in the posted code but you need to ensure that main does not exit (i.e. return) until your threads have finished.
HI,
R u creating the thread a sdetached or attached thread?
If you are creating it as a attcahed thred the call pthread_join() and return after the call.
Raghu
Thank gpraghuram
oh yes....you're right. I forget to set the attribute to be JOINABLE, and join them to the main thread, so that the main thread could wait for all of the child threads to be terminated.
Anyway, how about the same resource shared by two threads ?
I have to use the pthread_mutex_t to lock it right ?
I am not sure when to lock the resource. Let's say, there are 2 threads, one is to write data, and another is to read data, so in either reading or writing, we lock the resource ? or we lock only when we write ?
Banfa 9,065
Expert Mod 8TB
Lock for both reading and writing but for efficiency keep the lock for as short a time as possible.
If you don't lock for reading the writing thread may change the data in the middle of you reading it which could produce very strange results.
Sign in to post your reply or Sign up for a free account.
Similar topics
by: lokb |
last post by:
Hi,
I am creating a detach thread as shown below and caling pthread_create in
a while loop where the file names in the directory are fetched and is
passed as a parmater to pthread create. The...
|
by: stefvienna |
last post by:
Hi group,
I'm trying compiling Python-2.4.1 and it fails builing the _socket
extension with the following message:
building '_socket' extension
gcc -pthread -DNDEBUG -g -O3 -Wall...
|
by: nan.li.g |
last post by:
Hello, all,
I have an interesting problem about stl map and pthread on Linux
and g++. The source code is as follows.
//mt_map_test.cpp
#include <string>
#include <map>
#include <unistd.h>...
|
by: david wolf |
last post by:
The following pthread code cannot compile, I want to know why. Can
somebody give me direction on this?
if I replace the following line of code
status1 = pthread_create(&threadID1, NULL, read,...
|
by: kanchan |
last post by:
Hi, I am writing a client for a real time audio streaming server. I am
using pthread for that. I have one thread receiving data on a socket from
the server. After buffering some data, other thread...
|
by: Yim |
last post by:
In below codes,
After 10 seconds, function t() was called. So far everything is ok.
Then I want to awake blocked read(). So want to exit program.
In t(), how to do?
(in t(), close(sockfd) don't...
|
by: noleander |
last post by:
I've got an application that uses Pthread to do threading. Mostly Im using
Condition Variables and the associated function calls:
- pthread_cond_wait()
- pthread_cond_signal()
-...
|
by: Sean |
last post by:
Hi,
I am trying to write a simple chat/text messaging program but I am
having some problems. I am a rookie when it comes to socket programming
so I am not sure if I am doing the write thing or...
|
by: Stuart |
last post by:
I am in the process of teaching myself socket programming. I am
"playing around" with
some simple echo server-client programs for m the book TCP/IP Sockets
in C.
The Server program is:
...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
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
|
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...
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
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,...
|
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...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
| |